微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 将证书添加到 Windows 中的 Trust Root 存储

如何解决C++ 将证书添加到 Windows 中的 Trust Root 存储

我有一项任务是将 openssl 库生成的证书(私钥和证书文件)从我的 C++ 程序添加到 Windows 中的 Trust Root Storage。 你能展示一些代码示例吗?我想我应该使用 Win Api,但我还没有找到示例。也许有人有相同的任务或可以推荐相关资源。 我还发现只有 C++ access trusted root certificates 但这是相反的问题。而不是我需要在存储中添加证书。

解决方法

我不知道这是否是最好的方法,但至少它对我有用(我假设您想导入当前用户的存储而不是机器证书存储)。

首先,您必须将 PFX 文件加载到 CRYPT_DATA_BLOB(它是一个包含指向缓冲区和相关长度的指针的结构)。基本上,您将 PFX 读入缓冲区并相应地设置长度。然后,您可以使用 PFXImportCertStore 将该 CRYPT_DATA_BLOB 导入证书存储区。这个证书存储是一个临时的,所以它还没有进入你想要的证书存储。然后,您必须打开要真正导入证书的证书存储(通过使用 CertOpenSystemStore),使用 CertEnumCertificatesInStore 从临时证书存储中提取证书对象,并使用 CertAddCertificateContextToStore 将其插入最终证书存储。

这段代码或多或少地显示了以上所有内容:

#include <Windows.h>
#include <wincrypt.h>

int main(int argc,char** argv) {
    UNREFERENCED_PARAMETER(argc);
    UNREFERENCED_PARAMETER(argv);

    unsigned char buffer[8192];
    CRYPT_DATA_BLOB key;
    key.cbData = 0;
    key.pbData = buffer;

    HANDLE h = CreateFile(L"c:\\temp\\server.pfx",FILE_GENERIC_READ,NULL,OPEN_EXISTING,NULL);
    ReadFile(h,buffer,8192,&key.cbData,NULL);
    CloseHandle(h);

    HCERTSTORE store = PFXImportCertStore(&key,L"mypassword",0);
    PCCERT_CONTEXT ctx = CertEnumCertificatesInStore(store,NULL);
    HCERTSTORE rootStore = CertOpenSystemStore(NULL,L"ROOT");
    CertAddCertificateContextToStore(rootStore,ctx,CERT_STORE_ADD_REPLACE_EXISTING,NULL);
    CertCloseStore(store,0);
    CertCloseStore(rootStore,0);
    return 0;
}

为简洁起见,代码不包含任何错误检查。它还假设临时存储中只有一个证书(否则您应该将 CertEnumCertificatesInStore 放入循环中)。无论如何,我认为您可以从这里构建(您应该检查许多方法可用的选项)。

记得在项目中添加 crypt32.lib。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。