2016-12-01 4 views
1

Я попытался получить секретный ключ из certstore с помощью API окон (PFXExportCertStoreEx).Есть ли способ получить секретный ключ в структуре EVP_KEY из окна certstore?

Этот API может экспортировать CRYPT_DATA_BLOB из certstore для соответствующего CERT_INDEX. Но мне нужен закрытый ключ в структуре EVP_KEY, так как мое приложение использует API-интерфейс openssl для SSL_CTX. Таким образом, экспортированная структура CRYPT_DATA_BLOBit не подходит для EVP_PKEY в контексте SSL (SSL_CTX).

Любая помощь будет оценена по достоинству.

Я новичок в этом сертификационном магазине. Если вам нужна дополнительная информация, дайте мне знать.

+0

Hello! Вы поняли? Я хочу то же самое! Если да, молись, поделитесь с нами! –

ответ

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. –