2010-10-14 7 views
4

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

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

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

пользователь админ domainCompany \ adminsystems», который устанавливает сертификат

Администратор пользователя установить его, как это:.

Войти Session как " domainCompany \ adminsystems" сертификата PFX-файл Как установить PFX и с помощью мастера ключ частного не проверить на экспорт Введите пароль и установить

Существует приложение Web, который AppPool Идентичность:.... NETWORK SERVICE счет

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

в preiis01,

Этот пользователь администратор выполняет ПМК -> оснастке -> Сертификаты на локальном компьютере. В узле -> Personal -> Сертификаты, он видел сертификат клиента:

выдан ENTIDAD КОМПАНИИ ОБЕСПЕЧИТ SA - СИФ A93 - Номбр SURNAME1 NAME1

Выдан FNMT Clase 2 CA

В свойствах сертификат, отпечаток: "93 Ьс a4 объявление 58 с9 3в аф 8b Е.Б. 0b 2f 86 c7 9d 81 70 a6 c4 13"

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

winhttpcertcfg.exe LOCAL_MACHINE \ My -s «ENTIDAD COMPANY INSURE SA - CIF A 93 - Номбр SURNAME1 NAME1" -g -a "NETWORK SERVICE"

Результат:

Matching certificate:

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

OU=703015476

OU=FNMT Clase 2 CA

O=FNMT

C=ES

Granting private key access for account: NT AUTHORITY\NETWORK SERVICE

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

winhttpcertcfg.exe -l -c LOCAL_MACHINE \ Мои -s "ENTIDAD COMPANY ОБЕСПЕЧИТ SA - СИФ A93 - Номбр SURNAME1 NAME1"

результат:

Matching certificate:

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

OU=700012476

OU=FNMT Clase 2 CA

O=FNMT

C=ES

Additional accounts and groups with access to the private key include: domainCompany\adminsystems NT AUTHORITY\SYSTEM BUILTIN\Administrators NT AUTHORITY\NETWORK SERVICE

ТЕПЕРЬ, в странице ASPX в веб-приложения в сервере Win2003, IIS 6.0, у меня есть этот код:

Примечание: значение для X509Certificate2.HasPrivateKeyAccess() не является (ложь) для «ENTIDAD COMPANY ОБЕСПЕЧИТ SA - СИФ 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);

Error al firmar con certificado: System.Security.Cryptography.CryptographicException: Cannot find the certificate and private key for decryption.

at System.Security.Cryptography.Pkcs.PkcsUtils.CreateSignerEncodeInfo(CmsSigner signer, Boolean silent) at System.Security.Cryptography.Pkcs.SignedCms.Sign(CmsSigner signer, Boolean silent) at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent) at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer) at ASP.dgsfp_test_testcert_aspx.FirmarConCertificado(String nombreCertificado, X509Certificate2 certificate) in c:\Company\App\Test\TestCert.aspx:line 242

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

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 My 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

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

FindPrivateKey helps user to find the location of the Private Key file of a X.50 9 Certificate.

Usage: FindPrivateKey [{ {-n } | {-t } } [-f | -d | -a]]

subject name of the certificate

thumbprint of the certificate (use certmgr.exe to get it)

-f output file name only

-d output directory only

-a output absolute file name e.g. FindPrivateKey My CurrentUser -n "CN=John Doe"

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

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

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

обновление:

пользователя в домене «domainCompany \ Pre_Certificado» установить сертификат в магазин локальной машине.

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 с помощью сервера терминалов)

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

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

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

+0

Моя старшая битва: http://stackoverflow.com/questions/3905539/fighting-with-certificates-access-was-not-successfully-obtained-for-the-private – Kiquenet

ответ

2

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

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

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

+0

Не, если олицетворение отключено. –

+0

анонимный доступ и безопасность Интегрированные в Windows активы. – Kiquenet

4

Выполните первые 2 шага, как то же самое, как если бы с IIS 7.5 (click here)

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

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

winhttpcertcfg.exe -g -a "[имя_компьютера] \ NETWORK SERVICE" -с LOCAL_MACHINE \ [Сохранить] -s "[Тема]"

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

+0

+1 Мне жаль, что я не смог бы это сделать сто раз. В частности, «Примечание» в конце. –

 Смежные вопросы

  • Нет связанных вопросов^_^