我尝试使用Windows API(PFXExportCertStoreEx)从certstore获取私钥。
此API能够从certstore导出CRYPT_DATA_BLOB以用于相应的CERT_INDEX。但我需要EVP_KEY结构中的私钥,因为我的应用程序使用openssl API进行SSL_CTX。因此导出的结构CRYPT_DATA_BLOBit不适合SSL上下文中的EVP_PKEY(SSL_CTX)。
任何帮助都将不胜感激。
我是这个Windows证书库的新手。如果您需要更多信息,请告诉我。
答案 0 :(得分:0)
CRYPT_DATA_BLOB dataBlob = {0};
if(PFXExportCertStoreEx(hStore, &dataBlob, password, NULL,
EXPORT_PRIVATE_KEYS | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY | REPORT_NO_PRIVATE_KEY))
{
if (dataBlob.cbData > 0)
{
dataBlob.pbData = (BYTE*)malloc(dataBlob.cbData);
if (PFXExportCertStoreEx(hSystemStore, &dataBlob, password.toStdWString().c_str(), NULL,
EXPORT_PRIVATE_KEYS | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY | REPORT_NO_PRIVATE_KEY))
{
EVP_PKEY *pkey;
X509 *cert;
STACK_OF(X509) *ca = NULL;
PKCS12 *p12;
int i;
CRYPTO_malloc_init();
OpenSSL_add_all_algorithms();
SSLeay_add_all_algorithms();
ERR_load_crypto_strings();
BIO* input = BIO_new_mem_buf((void*)dataBlob.pbData, dataBlob.cbData);
p12 = d2i_PKCS12_bio(input, NULL);
PKCS12_parse(p12, password.toStdString().c_str(), &pkey, &cert, &ca);
}
}
}