使用WinHTTP API进行证书固定

sno*_*h09 4 c ssl winapi winhttp

是否可以使用Win32 WinHTTP API来实现证书固定,如果可以,怎么办?即,如何才能针对“已知的良好”证书检查返回的服务器证书,最好不必将证书永久写入本地证书存储中。

sno*_*h09 5

(受jww的回答启发)

首先,我发现此页面是阅读钉书以及证书和公钥钉书之间的选择的绝佳背景。

我使用WinHTTP API实现了证书固定,如下所示:

  1. 在WinHttpOpen之后但在WinHttpConnect之前,为发送请求的时间设置一个回调:

    WinHttpSetStatusCallback(hSession, &callbackFunc, WINHTTP_CALLBACK_SENDING_REQUEST, NULL);

  2. 在回调函数中,检索原始证书blob:

    PCCERT_CONTEXT pCert=NULL; DWORD dwSize=sizeof(pCert); WinHttpQueryOption(hInternet, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &pCert, &dwSize);

  3. 然后,如果执行完整的证书固定,则sha1(pCert->pbCertEncoded)与已知的合格证书SHA1指纹进行比较。

  4. -或者-如果改为进行公钥固定,则与sha1(pCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData)服务器公钥的已知良好SHA1 比较。