Исключение при попытке прочитать PrivateKey из Windows Certstore - PullRequest
4 голосов
/ 30 мая 2011

Я создал пару закрытых и открытых ключей с помощью OpenSSL, а затем сгенерировал файл .p12 для импорта его в мое хранилище сертификатов Windows.Пара ключей и файлы .p12 были созданы в Windows XP, и я пытаюсь использовать их в Windows 7. Я пытаюсь получить доступ к ключу из веб-службы (.svc) в IIS.Если я пытаюсь прочитать закрытый ключ из автономного приложения, я могу сделать это без проблем, но когда я пытаюсь прочитать его из своего веб-приложения, я всегда получаю следующее исключение:

'cert.PrivateKey' threw an exception of type 'System.Security.Cryptography.CryptographicException'

Ивот и вся трассировка стека:

en System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
en System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
en System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
en System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
en System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
en ValidKeyDll.ValidKey.getLlaveDeAlmacen(String almacen, Boolean esLlavePrivada) en C:\Users\desarrollo\Documents\ValidKeyDll\ValidKeyDll\ValidKey.cs:línea 58
en ValidKeyDll.ValidKey.firmaCadena(String almacen, String cadenaFirmar) en C:\Users\desarrollo\Documents\ValidKeyDll\ValidKeyDll\ValidKey.cs:línea 117

И это моя часть кода, которая читает ключ:

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
RSACryptoServiceProvider csp = null;
foreach (X509Certificate2 cert in store.Certificates)
{
   if (cert.Subject.Contains(almacen))
   {
      if (cert.NotAfter.CompareTo(System.DateTime.Now) <= 0)
         throw new CertificadoVencidoException();

      if (isPrivateKey)
         csp = (RSACryptoServiceProvider)cert.PrivateKey;
      else
         csp = (RSACryptoServiceProvider)cert.PublicKey.Key;

      break;
   }
}

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

ВЕЩИ, КОТОРЫЕ РАССМОТРЕТЬ:

  • Закрытый ключ экспортируется.
  • Пользователь IIS_IUSRS имеет разрешения на сертификат.

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Я наконец решил проблему, но не смог опубликовать ответ до сих пор (потому что я новичок):

Дело в том, что я импортировал .p12 неправильно. Я дважды щелкнул по нему и следовал инструкциям. Для этого нужно было поместить сертификат в хранилище сертификатов «Текущий пользователь - личный», поэтому я подумал, что достаточно просто перенести сертификат из этого хранилища в хранилище локальных компьютеров ... но, о, сюрприз! не было. После большого пересмотра я обнаружил, что IIS имеет возможность импортировать сертификаты изнутри себя, и это помещает сертификат непосредственно в хранилище сертификатов локального компьютера. Если у кого-то есть какая-то проблема или просто хотите посмотреть, как это сделать, выполните следующие действия:

  • Откройте IIS.
  • Перейти к сертификатам сервера (извините, если вы не можете найти точные слова, у меня Windows на испанском языке)
  • Выбрать импорт
  • Выберите ваш файл. Если ваш файл .p12 похож на мой, то выберите для просмотра *. *
  • Введите пароль
  • Принять ... и вуаля
1 голос
/ 30 мая 2011

Да, это проблема с разрешениями.Я боролся с этим некоторое время назад.В настоящее время я использую winhttpcertcfg для добавления соответствующих разрешений.

Вы также должны проверить эту ссылку: http://benoit808.wordpress.com/2008/10/31/cryptographicexception-the-handle-is-invalid/.

Есть также статья об этом http://www.stevefenton.co.uk/Content/Blog/Date/201101/Blog/X509-Certificates-On-Windows-Server-2003/. Выможет также потребоваться добавить разрешения для учетной записи IIS_WPG и IUSR (статья не упоминает об этом).

...