2016-12-01 33 views
1

我嘗試使用Windows API(PFXExportCertStoreEx)從certstore獲取私鑰。有什麼辦法從windows certstore獲取EVP_KEY結構中的私鑰?

此API能夠從certstore中導出CRYPT_DATA_BLOB以獲取相應的CERT_INDEX。但是我需要EVP_KEY結構中的私鑰,因爲我的應用程序使用openssl API來處理SSL_CTX。所以導出的結構CRYPT_DATA_BLOBit不適合SSL上下文(SSL_CTX)中的EVP_PKEY。

任何幫助,將不勝感激。

我是這個windows certstore的新手。如果您需要更多信息,請告訴我。

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

在上面的代碼可能會有用。它爲我工作,但你需要使用OpenSSL API @Carlos。 –

相關問題