是否可以使用 Win32 WinHTTP API 实现证书锁定,如果可以,如何实现? IE。我如何根据“已知良好”证书检查返回的服务器证书,最好不必将证书永久写入本地证书存储区。
最佳答案
(灵感来自jww的回答)
首先我找到了this page成为关于固定以及证书和公钥固定之间的选择的优秀背景阅读。
我使用 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 进行比较。
关于使用 WinHTTP API 固定证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125165/