Сертификаты:Невозможно найти сертификат и закрытый ключ для расшифровки. Ошибка при подписании.

StackOverflow https://stackoverflow.com/questions/3936065

Вопрос

Я работаю в компании со многими серверами и компьютерами для разработчиков.Сервера Win2003, ПК разработчика Windows XP.

На сервере Win2003 с именем preiis01 в тестовой среде другие сотрудники компании устанавливают сертификат клиента, используя любого другого пользователя (domainCompany\adminsystems) для входа на сервер preiis01.

Любой администратор использует пользователя «domainCompany\adminsystems» для входа на сервер preiis01 (с использованием сервера терминалов, удаленного рабочего стола для Windows XP).

администратором является доменная компания\adminsystems", который устанавливает сертификат.

Пользователь с правами администратора устанавливает его следующим образом:

Вход в сеанс, как и сертификат "Domaincompany adminsystems" - это файл PFX.Установите PFX и используйте мастер.Приватный ключ не проверяется на экспорт.Введите пароль и установите.

Существует веб-приложение, которым является AppPool Identity:Учетная запись СЕТЕВОЙ СЛУЖБЫ.

веб-сервер — IIS 6.0.

в преиис01,

Этот пользователь-администратор выполняет mmc -> Snap in -> Сертификаты для локального компьютера.В узле -> Персональные -> Сертификаты он увидел сертификат клиента:

Выдано ENTIDAD COMPANY INSURE SA - CIF A93 - НОМЕР ФАМИЛИЯ1 ИМЯ1

Выдано FNMT Class 2 CA

В свойствах сертификата отпечаток:«93 до н.э. a4 ad 58 c9 3c af 8b eb 0b 2f 86 c7 9d 81 70 a6 c4 13»

Этот пользователь-администратор выполняет следующие команды:

winhttpcertcfg.exe LOCAL_MACHINE\My -s "ENTIDAD COMPANY INSURE SA - CIF A93 - НОМЕР ФАМИЛИЯ1 ИМЯ1" -g -a "СЕТЕВАЯ СЛУЖБА"

Результат:

Соответствующий сертификат:

CN=ENTIDAD COMPANY INSURE SA - CIF A93 - НОМЕР ФАМИЛИЯ1 ИМЯ1

OU=703015476

OU=FNMT Класс 2 CA

О=ФНМТ

С=ES

Предоставление доступа к частному ключе для учетной записи:NT AUTHORITY\СЕТЕВАЯ СЛУЖБА

Теперь пользователь с правами администратора выполняет эту команду:

winhttpcertcfg.exe -l -c LOCAL_MACHINE\My -s "ENTIDAD COMPANY INSURE SA - CIF A93 - НОМЕР ФАМИЛИЯ1 ИМЯ1"

Результат:

Соответствующий сертификат:

CN=ENTIDAD COMPANY INSURE SA - CIF A93 - НОМЕР ФАМИЛИЯ1 ИМЯ1

OU=700012476

OU=FNMT Класс 2 CA

О=ФНМТ

С=ES

Дополнительные учетные записи и группы с доступом к частному ключу включают:Domaincompany adminsystems nt athily System Buildin Administrators nt Authority Setwork Service

СЕЙЧАС на странице aspx в веб-приложении на сервере Win2003, IIS 6.0 у меня есть этот код:

Примечание:значение для X509Certificate2.HasPrivateKeyAccess() равно NO (false) для сертификата «ENTIDAD COMPANY INSURE SA — CIF A93 — NOMBRE SURNAME1 NAME1».

Приложение ASP.NET выполняется с использованием идентификатора::NT AUTHORITY\СЕТЕВАЯ СЛУЖБА

lbInfo.Text += "<br/><br/>ASP.NET application executes using the identity :: <b>" + WindowsIdentity.GetCurrent().Name + "</b><br>";


            var store = new X509Store(StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            Certificates = store.Certificates;
            repeater1.DataSource = Certificates;
            repeater1.DataBind();

            var nombreCertificado = "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1";

            store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);

            X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySubjectName, nombreCertificado, false);

            if (col.Count > 0)
            {
                X509Certificate2 certificate = col[0];
                store.Close();
                Message.Text = "Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;

                FirmarConCertificado(nombreCertificado, certificate);

            }
            else
            {
                store.Close();
                Message.Text = "El certificado " + nombreCertificado + " no esta instalado en la máquina";
            }


public void FirmarConCertificado(string nombreCertificado, X509Certificate2 certificate)
{
    try
    {
 var mensaje = "Datos de prueba";
                System.Text.Encoding enc = System.Text.Encoding.Default;
                byte[] data = enc.GetBytes(mensaje);

                var contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(data);
                var signedCms = new System.Security.Cryptography.Pkcs.SignedCms(contentInfo, true);

                var cmsSigner = new System.Security.Cryptography.Pkcs.CmsSigner(certificate);

                //  Sign the CMS/PKCS #7 message
                signedCms.ComputeSignature(cmsSigner);

                //  Encode the CMS/PKCS #7 message
               var ret = Convert.ToBase64String(signedCms.Encode());

 Message.Text += "Firmado con Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;
 }
 catch (Exception ex)
 {
 Message.Text = "Error al firmar con certificado: " + ex.ToString();
 Message.Text += "<br /><br />InnerException: " + ex.InnerException;
 }

}

Код не работает для меня, и я получаю эту ошибку:Невозможно найти сертификат и закрытый ключ для расшифровки.

Строка ошибки:signedCms.ComputeSignature(cmsSigner);

Ошибка в сертификате фирмы:System.Security.Cryptography.CryptographicException:Не могу найти сертификат и закрытый ключ для дешифрования.

at System.security.cryptography.pkcs.pkcsutils.createSignerEncodeinfo (CMSSigner Signer, Boolean Silent) на System.security.cryptography.pkcs.signedcms.sign (cmssigner signer, boolean silent) at system.security.cryptography. (CMSSigner Signer, Boolean Silent) at system.security.cryptography.pkcs.signedcms.computeGinature (CMSSigner) на ASP.DGSFP_TEST_TESTCERT_ASPX.FIRMARCONCERTIFICADO (String nombrecertificad строка 242

Затем пользователь-администратор (я помню, который установил сертификат) выполняет следующие команды:

FindPrivateKey My Localmachine -T "93 до н.э. A4 AD 58 C9 3C AF 8B EB 0B 2F 86 C7 9D 81 70 A6 C4 13" –C

Найдите provivatekey my localmachine -n ​​"Entidad Company страховая SA - CIF A93 - NOBMRE FUNMAME1 NAME1" –A

Найдите provivatekey my localmachine -n ​​"cn = entidad company застрахован SA - CIF A93 - NOBMRE FUNMAME1 NAME1" –A

Результат для всех трех команд один и тот же:

FindPrivateKey помогает пользователю найти местоположение файла закрытого ключа сертификата X.50 9.

Использование:FindPrivateKey [{{-n} | {-t}} [-f | -Д | -a]

Название предмета сертификата

Отпечаток сертификата (используйте certmgr.exe, чтобы получить его)

-f только имя выходного файла

-d только выходной каталог

-Оинку абсолютное имя файла например, например,Найди -это мой CurrentUser -n "cn = Джон Доу"

напримерFindPrivateKey My Localmachine -t "03 33 98 63 D0 47 E7 48 71 33 62 64 76 5 C 4C 9d 42 1d 6b 52" -c

FindPrivateKey ничего не получает, но winhttpcertcfg.exe -l работает нормально (соответствующий сертификат)

Мы предоставили привилегии пользователю сетевой службы с помощью инструмента winhttpcertcfg.exe, и в коде ASP.NET (выполняется под учетной записью сетевой службы) найден сертификат.Но происходит сбой при подписании с использованием сертификата.

Если бы кто-нибудь мог дать нам некоторую информацию или предложения

обновлять:

Пользователь в домене «domainCompany\Pre_Certificado» устанавливает сертификат на локальном компьютере хранилища.

DomainCompany\Pre_Certificado — администратор в группе IIS_WPG, имеет локальные политики:«Войти как сервис»

Я настраиваю AppPool Identity в IIS 6.0 для:доменная компания\Pre_Certificado

Приложение ASP.NET выполняется с использованием идентификатора::доменная компания\Pre_Certificado

Я перезапускаю AppPool и запускаю приложение, получаю System.Security.Cryptography.CryptographicException:Невозможно найти сертификат и закрытый ключ для расшифровки.

Если я проверю еще раз, войду в сеанс на сервере IIS, используя пользователя domainCompany\Pre_Certificado, я вызову страницу в приложении ASP.NET, и все будет в порядке.

(примечание:войдите на сервер IIS с помощью Terminal Server)

Но если выйти из сеанса на сервере IIS (пользователь:domainCompany\Pre_Certificado), я получаю ту же ошибку:

System.Security.Cryptography.CryptographicException:Невозможно найти сертификат и закрытый ключ для расшифровки.

Какие-либо предложения ??

Это было полезно?

Решение

Пожалуйста, проверьте это документ который поможет вам решить проблему.Я бы рекомендовал использовать следующий параметр команды:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER 

Другие советы

Выполните первые два шага так же, как и при IIS 7.5 (нажмите здесь)

  1. Создать/Приобрести сертификат.Убедитесь, что у него есть закрытый ключ.
  2. Импортируйте сертификат в учетную запись «Локальный компьютер».Лучше всего использовать сертификаты MMC. Обязательно установите флажок «Разрешить экспорт закрытого ключа».
  3. Запустите приведенную ниже команду от имени администратора.Замените следующее:

    • Замените [Subject] на тему сертификата и используйте кавычки, если он содержит пробелы.Я думаю, вы также можете просто поставить первое слово, если нет другого сертификата, начинающегося с той же темы.
    • Замените [Store] хранилищем сертификатов, в которое вы импортировали, я считаю, что по умолчанию это «ROOT» или «MY» в IIS 6, т.е.«LOCAL_MACHINE OOT» или «LOCAL_MACHINE\MY»
    • Замените [имя_компьютера] именем компьютера.Возможно, вы сможете использовать обозначение «.» для [computernam], т.е.". ETWORK SERVICE", но я не пробовал.

winhttpcertcfg.exe -g -a "[имя компьютера] ETWORK SERVICE" -c LOCAL_MACHINE\[Store] -s "[Тема]"

Примечание: Если вы используете пул приложений ASP.NET под идентификатором, отличным от «NETWORK SERVICE», вам потребуется изменить «NETWORK SERVICE» в приведенной выше команде на идентификатор, который вы запускаете в пуле приложений IIS.

Возможно, потребуется также предоставить доступ анонимному пользователю.Если вы разрешаете анонимный доступ, тогда запрос выполняется от имени анонимного пользователя, а не от сетевой службы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top