是否可以使用Win32 WinHTTP API实现证书固定,如果是,如何实现?即如何根据“已知商品”检查退回的服务器证书?一,最好不必将证书永久写入当地证书商店。
答案 0 :(得分:4)
是否可以使用Win32 WinHTTP API实现证书固定,如果是,如何实现?
看起来您可以固定证书。您可以使用WINHTTP_STATUS_CALLBACK
设置回调。使用WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER
调用回调时,您可以使用WinHttpQueryOption
和WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT
检查证书。服务器证书以WINHTTP_CERTIFICATE_INFO
结构返回。
SSL in WinHTTP处的页面提供了更多信息。
...无需将证书永久写入本地证书存储区。
证书存储区的问题是另一个权威机构声称可以对您要连接的网站进行认证。在这种情况下,真正的受信任的权限甚至不需要在商店中获取pwn' d。这是Web应用/浏览器安全模型和CA Zoo的[明显]问题之一。
答案 1 :(得分:4)
(受到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进行比较。