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

时间:2009-10-13 00:47:37

标签: c cryptoapi winhttp

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

  1. App Starts
  2. App使Windows信任服务器的根CA(不需要GUI,只需系统调用)
  3. App与服务器对话,完成其工作等。
  4. 应用程序让Windows忘记了服务器的根CA
  5. 完成
  6. NOT 希望此根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 - 它很接近,但是没有解决在应用程序运行时仅使暂时信任的证书的问题。

    谢谢!

1 个答案:

答案 0 :(得分:2)

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