Преобразование закрытого ключа в хранилище 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 () для экспорта того, что вам нужно.