gpt4 book ai didi

c - WinHttp:如何使用临时证书存储?

转载 作者:行者123 更新时间:2023-12-03 02:09:01 31 4
gpt4 key购买 nike

我有一个 C++ 应用程序,它与我们的一台服务器建立 HTTPS 连接。在我的理想世界中,我希望发生以下情况:

  1. 应用启动
  2. 应用程序使 Windows 信任服务器的根 CA(无需 GUI,只需系统调用)
  3. 应用程序与服务器通信、执行其工作等。
  4. 应用程序使 Windows 忘记服务器的根 CA
  5. 完成

我确实希望此根CA一定受到其他应用程序的信任。因此我不想在系统范围内安装证书。如果用户不需要管理员权限,我也希望它。

我最初的计划是创建一个内存中 (CERT_STORE_PROV_MEMORY) 存储,将我的证书添加到其中,然后使用 CertAddStoreToCollection 将该内存中存储添加到系统存储中。

虽然所有 CryptoAPI 函数调用都成功,但 WinHttp 不喜欢它。

这是我正在做的事情的骨架 - 也许有人知道一个技巧?或者也许这从一开始就是错误的?

hMemStore = CertOpenStore(CERT_STORE_PROV_MEMORY, ...);
pCert = CertCreateCertificateContext(..., pCertBytes, ...);
CertAddCertificateContextToStore(hMemStore, pCert, ...);
hRootStore = CertOpenSystemStore(NULL, "ROOT");
CertAddStoreToCollection(hRootStore, hMemStore, ...);

// Then later on...
WinHttpSendRequest(...)

一些注意事项:

  • 当我使用 WinHttp 的 SECURITY_FLAG_IGNORE_UNKNOWN_CA 时,一切正常,因此我相当确定这确实是问题所在。
  • 我已经看过this SO question - 它很接近,但没有解决在应用程序运行时使证书仅暂时受信任的问题。

谢谢!

最佳答案

由于您不希望其他应用程序信任此证书,因此您需要自己完成部分证书验证。使用选项 SECURITY_FLAG_IGNORE_UNKNOWN_CA 禁用 CA 检查,然后获取连接到服务器 WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER 的回调。在该回调中,使用 WINHTTP_OPTION_SERVER_CERT_CONTEXT 获取证书并进行验证。如果不是您想要的人,请取消/关闭请求;如果正确,请继续请求。

关于c - WinHttp:如何使用临时证书存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1557710/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com