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

Is there any way to get private key in EVP_KEY structure from windows certstore?

我尝试使用 windows API(PFXExportCertStoreEx) 从 certstore 获取私钥。

此 API 能够从对应的 CERT_INDEX 的 certstore 中导出 CRYPT_DATA_BLOB。但是我需要 EVP_KEY 结构中的私钥,因为我的应用程序正在为 SSL_CTX 使用 openssl API。所以导出的结构CRYPT_DATA_BLOB不适合SSL上下文中的EVP_PKEY(SSL_CTX)。

如有任何帮助,我们将不胜感激。

我是这个 windows 证书库的新手。如果您需要更多信息,请告诉我。

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