有没有办法从Windows certstore获取EVP_KEY结构中的私钥?

时间:2016-12-01 11:07:54

标签: windows openssl certificate private-key

我尝试使用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证书库的新手。如果您需要更多信息,请告诉我。

1 个答案:

答案 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);
        }
    }
}