C++正在向Windows中的信任根存储添加证书

C++ adding certificate to Trust Root storage in Windows

本文关键字:信任 存储 添加 证书 Windows C++      更新时间:2024-05-09

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

我不知道这是否是最好的方法,但至少它对我有效(我认为你想导入到当前用户的存储中,而不是机器证书存储中(。

首先,您必须将PFX文件加载到CRYPT_DATA_BLOB中(它是一个包含指向缓冲区的指针和相关长度的结构(。基本上,您将PFX读取到缓冲区中,并相应地设置长度。然后,您可以使用PFXImportCertStore将CRYPT_DATA_BLOB导入证书存储。这个证书存储是临时的,所以它还没有进入你想要的证书存储。然后,您必须打开要真正导入证书的证书存储(通过使用CertOpenSystemStore(,使用CertEnumCertificatesIStore从临时证书存储中提取证书对象,并使用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, 0, NULL,  OPEN_EXISTING, 0, 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;
}

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

请记住将crypt32.lib添加到项目中。