Преобразование закрытого ключа в хранилище Windows в PEM (для OpenSSL)

Я хочу получить закрытый ключ из магазина Windows и преобразовать его в PEM, чтобы использовать его в OpenSSL. Я искал способ сделать это в течение нескольких часов!

  • Я использую CertFindCertificateInStore(), чтобы получить CERT_CONTEXT (который, я знаю, содержит закрытый ключ с использованием параметра поиска).
  • Затем я использовал CryptAcquireCertificatePrivateKey(), чтобы получить HCRYPTPROV (только из-за имени функции).
  • Теперь я использую CryptGetUserKey(), чтобы получить HCRYPTKEY (только потому, что он звучит правильно...?!)

Но теперь я снова застрял.

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

2 ответа

Решение

Первые два в порядке. Но вам нужно использовать CryptExportPKCS8. Он экспортирует закрытый ключ в буфер в формате PKCS #8 DER. Из PKCS # 8 вы можете получить его в структуру Open50L X509 (используя функции d2i и буфер памяти в качестве входных данных в структурах BIO).

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

Единственное, что вы можете сделать, это подписать данные с помощью такого закрытого ключа.

Я оставляю ответ как есть (в конце концов, без dbasic я бы застрял:-)), но я должен добавить еще:

Окончание поддержки CryptExportPKCS8() закончилось XP/2003, поэтому мы должны использовать PFXExportCertStoreEx(), однако эта функция экспортирует хранилище WHOLE. Таким образом, чтобы экспортировать только один сертификат, вам нужно использовать хранилище памяти.

Посмотрите этот пример о том, как это сделать: http://msdn.microsoft.com/en-us/library/windows/desktop/aa382037(v=vs.85).aspx

Вставьте нужный сертификат в хранилище памяти, а затем используйте PFXExportCertStoreEx () для экспорта того, что вам нужно.

Другие вопросы по тегам