C++正在向Windows中的信任根存储添加证书
C++ adding certificate to Trust Root storage in Windows
我有一项任务,要从我的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添加到项目中。
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 为什么C中的通用链表中存储的数据已损坏
- CertGetCertificateChain 具有支持的内存存储和证书信任列表