certificate - 如何自动将 Windows 根证书导出到文件?

标签 certificate ssl-certificate x509certificate pem cryptoapi

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

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

MIICvDCCAiUCEEoZ0jiMglkcpV1zXxVd3KMwDQYJKoZIhvcNAQEEBQAwgZ4xHzAd

BgNVBAoTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxFzAVBgNVBAsTDlZlcmlTaWdu

....

Rj1QNAufcFb2jip/F87lY795aQdzLrCVKIr17aqp0l3NCsoQCY/Os68olsR5KYSS

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

-----证书结束-----

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

最佳答案

您要找的是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;
}

关于certificate - 如何自动将 Windows 根证书导出到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45531141/

相关文章:

security - 如何检查是否启用了 Authenticated Origin Pulls?

java - 有人可以帮助我使用 BouncyCaSTLe 实现扩展主题备用名称吗?

WCF 使用 Https Web 服务,错误 : Could not establish trust relationship for the SSL/TLS secure channel with authority

ios - 无法在 AFNetworking 2 中使用自签名证书

nginx - 如何强制 Nginx 针对上游服务器 block 中存在的主机名验证上游证书?

带有 Kafka-Go 和证书的 Golang TLS。无连接

android - 使用 .cer 而不是 .p12 对 android 上的服务器进行身份验证

ssl - 带有非自签名证书的 CAS gradle 覆盖

java - 在 BouncyCaSTLe 中生成 X.509 证书时出现吊销状态未知错误

.net - 不使用 X509Store.Close 方法意味着什么?