【发布时间】:2010-12-06 04:12:09
【问题描述】:
我有一个 C++ 应用程序,它与我们的一台服务器建立 HTTPS 连接。 在我的理想世界中,我希望发生以下情况:
- 应用启动
- 应用程序使 Windows 信任服务器的根 CA(请不要使用 GUI,只需系统调用)
- 应用程序与服务器对话、完成工作等。
- App 让 Windows 忘记了服务器的根 CA
- 完成
我确实不希望这个根 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 - 它很接近,但没有解决在应用运行时使证书暂时受信任的问题。
谢谢!
【问题讨论】: