(受jww的回答启发)
首先,我发现此页面是阅读钉书以及证书和公钥钉书之间的选择的绝佳背景。
我使用WinHTTP API实现了证书固定,如下所示:
在WinHttpOpen之后但在WinHttpConnect之前,为发送请求的时间设置一个回调:
WinHttpSetStatusCallback(hSession, &callbackFunc, WINHTTP_CALLBACK_SENDING_REQUEST, NULL);
在回调函数中,检索原始证书blob:
PCCERT_CONTEXT pCert=NULL;
DWORD dwSize=sizeof(pCert);
WinHttpQueryOption(hInternet, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &pCert, &dwSize);
然后,如果执行完整的证书固定,则sha1(pCert->pbCertEncoded)
与已知的合格证书SHA1指纹进行比较。
-或者-如果改为进行公钥固定,则与sha1(pCert->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData)
服务器公钥的已知良好SHA1 比较。