2017-08-06 157 views
0

在windows計算機上,我想創建一個C++代碼,將windows根證書導出到.pem \ .crt文件(就像certmgr.msc工具允許我手動執行一樣)。 目前正在挖掘Windows的cryptoAPI文檔,但沒有找到任何東西。如何自動將Windows根證書導出到文件?

編輯:使用(線和在所述端部的多餘的字符之間unnecary換行)以下面的格式被創建的PEM證書低於soltuion 後:----- BEGIN CERTIFICATE -----

MIICvDCCAiUCEEoZ0jiMglkcpV1zXxVd3KMwDQYJKoZIhvcNAQEEBQAwgZ4xHzAd

BgNVBAoTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxFzAVBgNVBAsTDlZlcmlTaWdu

....

Rj1QNAufcFb2jip/F87lY795 aQdzLrCVKIr17aqp0l3NCsoQCY/Os68olsR5KYSS

3P + 6Z0JIppAQ5L9h + JxT5ZPRcz/4/Z1PhKxV0f0RY2M =

----- END CERTIFICATE -----

我不相信它會通過以下OpenSSL接受,什麼這是爲什麼?

回答

0

你在找什麼是CertEnumCertificatesInStore功能。 另外,如果您想在PEM中保存證書,您將需要CryptBinaryToString

#include <Windows.h> 
#include <wincrypt.h> 
#include <string> 
#include <fstream> 
#include <vector> 

#pragma comment(lib, "crypt32.lib") 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DWORD num = 1; 
    /* open root certificate store */ 
    HCERTSTORE hCertStore = CertOpenSystemStore(NULL, L"ROOT"); 

    PCCERT_CONTEXT pCert = nullptr; 
    while (pCert = CertEnumCertificatesInStore(hCertStore, pCert)) 
    { 
     /* if you need save certificate in PEM */ 
     DWORD size = 0; 
     CryptBinaryToString(pCert->pbCertEncoded, pCert->cbCertEncoded, CRYPT_STRING_BASE64HEADER, nullptr, &size); 
     std::vector<wchar_t> pem(size); 
     CryptBinaryToString(pCert->pbCertEncoded, pCert->cbCertEncoded, CRYPT_STRING_BASE64HEADER, 
      pem.data(), &size); 

     std::wstring pem_cert = std::to_wstring(num) + L".pem"; 
     std::wofstream pem_cert_file(pem_cert, std::ios::binary | std::ios::out); 
     pem_cert_file.write(pem.data(), pem.size() - 1); 


     /* or if you need save certificate in binary form (DER encoding)*/ 
     std::string der_cert = std::to_string(num) + ".cer"; 
     std::ofstream der_cert_file(der_cert, std::ios::binary | std::ios::out); 
     der_cert_file.write(reinterpret_cast<char*>(pCert->pbCertEncoded), pCert->cbCertEncoded); 
     ++num; 
    } 

    CertCloseStore(hCertStore, 0); 
    return 0; 
} 
+0

非常感謝!編輯我的問題的證書格式問題,我看到使用代碼後 – uriBaba

+0

@uriBaba對不起,忘了添加std :: ios ::二進制和刪除空字符 – plstryagain

+0

爲什麼你調用兩次CryptBinaryToString? – uriBaba