2017-08-06 79 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

相关问题