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

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

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

Любой администратор использует пользователя "domainCompany\adminsystems" для входа на сервер preiis01 (используя Terminal Server, Remote Desktop для Windows XP).

пользователь admin является domainCompany\adminsystems ", который устанавливает сертификат.

Администратор установит его так:

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

Существует веб-приложение, в котором AppPool Identity: NETWORK SERVICE.

веб-сервер - это IIS 6.0.

в preiis01,

Этот пользователь-администратор выполняет mmc → Snap in → Certificates for Local Machine. В node → Личные → Сертификаты он видел сертификат клиента:

Выдано ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1

Выдано FNMT Clase 2 CA

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

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

winhttpcertcfg.exe LOCAL_MACHINE\My -s "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" -g -a "СЕТЕВАЯ СЛУЖБА"

Результат:

Сертификат соответствия:

CN = ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1

OU = 703015476

OU = FNMT Clase 2 CA

О = FNMT

С = ES

Предоставление доступа к закрытому ключу для счет: NT AUTHORITY\NETWORK SERVICE

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

winhttpcertcfg.exe -l -c LOCAL_MACHINE\My -s "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1"

Результат:

Сертификат соответствия:

CN = ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1

OU = 700012476

OU = FNMT Clase 2 CA

О = FNMT

С = ES

Дополнительные учетные записи и группы с доступ к закрытому ключу:   domainCompany\adminsystems NT AUTHORITY\SYSTEM   BUILTIN\Администраторы NT AUTHORITY\NETWORK SERVICE

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

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

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

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: Не удается найти сертификат и закрытый ключ для дешифрования.

в System.Security.Cryptography.Pkcs.PkcsUtils.CreateSignerEncodeInfo(CmsSigner подписчик, булеанский молчание) в System.Security.Cryptography.Pkcs.SignedCms.Sign(CmsSigner подписчик, булеанский молчание) в System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner подписчик, булеанский молчание) в System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner подписывающее лицо) в ASP.dgsfp_test_testcert_aspx.FirmarConCertificado(String nombreCertificado, X509Certificate2 сертификат) в C:\Компания\App\Test\TestCert.aspx: линия 242

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

FindPrivateKey My LocalMachine -t "93 bc a4 ad 58 c9 3c af 8b eb 0b 2f 86 c7 9d 81 70 a6 c4 13" -c

FindPrivateKey Моя LocalMachine -n ​​ "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" -a

FindPrivateKey My LocalMachine -n "CN = ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" -a

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

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

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

имя субъекта сертификат

отпечаток сертификат (используйте certmgr.exe для получения она)

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

-d только директория вывода

- абсолютный файл вывода имя, например. FindPrivateKey My CurrentUser -n "CN = John Doe"

например. 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 отлично работает (соответствующий сертификат)

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

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

обновление:

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

domainCompany\Pre_Certificado - это администратор в группе IIS_WPG, имеет локальные политики: "Войдите в систему как услуга"

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

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

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

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

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

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

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

Любые предложения

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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