首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何自动将windows根证书导出到文件?

如何自动将windows根证书导出到文件?
EN

Stack Overflow用户
提问于 2017-08-06 18:39:38
回答 1查看 878关注 0票数 2

在windows机器上,我想创建一个将windows根证书导出到.pem \ .crt文件的c++代码(就像certmgr.msc工具允许我手动执行的操作一样)。目前正在搜索windows的cryptoAPI文档,但没有找到任何东西。

编辑:使用下面的解决方案后,将以以下格式创建PEM证书(行间不必要的换行符和末尾的额外字符):-BEGIN证书

MIICvDCCAiUCEEoZ0jiMglkcpV1zXxVd3KMwDQYJKoZIhvcNAQEEBQAwgZ4xHzAd

BgNVBAoTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxFzAVBgNVBAsTDlZlcmlTaWdu

……

Rj1QNAufcFb2jip/F87lY795aQdzLrCVKIr17aqp0l3NCsoQCY/Os68olsR5KYSS

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

-结束证书

我不相信它会被openSSL接受,这是什么原因呢?

EN

回答 1

Stack Overflow用户

发布于 2017-08-10 15:29:29

你要找的是CertEnumCertificatesInStore函数。另外,如果你想在PEM中保存证书,你将需要CryptBinaryToString

代码语言:javascript
复制
#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;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45531141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档