【问题标题】:Certificate pinning with WinHTTP API使用 WinHTTP API 固定证书
【发布时间】:2014-09-27 07:25:49
【问题描述】:

是否可以使用 Win32 WinHTTP API 实现证书固定,如果可以,如何实现? IE。如何检查返回的服务器证书与“已知良好”的证书,最好不必将证书永久写入本地证书存储区。

【问题讨论】:

    标签: c winapi ssl winhttp


    【解决方案1】:

    是否可以使用 Win32 WinHTTP API 实现证书锁定,如果可以,如何实现?

    看起来您可以固定证书。您可以使用WINHTTP_STATUS_CALLBACK 设置回调。当使用WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER 调用回调时,您可以使用WinHttpQueryOptionWINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT 检查证书。服务器证书以WINHTTP_CERTIFICATE_INFO 结构返回。

    SSL in WinHTTP 有一个页面提供更多信息。


    ...无需将证书永久写入本地证书存储区。

    证书存储的问题是另一个机构可能声称对您正在连接的站点进行认证。在这种情况下,真正的受信任的权威甚至不需要在商店中就可以得到 pwn'd。这是网络应用程序/浏览器安全模型和 CA Zoo 的 [明显] 问题之一。

    【讨论】:

    • 您好,您的回答为我指明了正确的方向,但我可以在接受之前提出两项更改:(1) WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT 没有提供足够的信息来固定证书,请改用 WINHTTP_OPTION_SERVER_CERT_CONTEXT 来获取完整的编码证书.并且 (2) WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER 已被弃用,并且在证书可用之前也会发生 - WINHTTP_CALLBACK_STATUS_SENDING_REQUEST 可以代替。
    • @snowcrash09 - 没什么大不了的。提供您自己的答案并接受它。我不会生气,我会投赞成票,因为它是一个更好的答案:) 这就是 SO 的工作原理。
    【解决方案2】:

    (受 jww 的回答启发)

    首先,我发现this page 是关于固定以及证书和公钥固定之间选择的优秀背景资料。

    我使用 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 进行比较。

    【讨论】:

    • 请注意,您通常希望散列完整的主题公钥信息 (SPKI),以确保安全并匹配 HTTP 公钥固定 (RFC 7230) 中使用的 pin。您可以在散列之前使用CryptEncodeObject(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, ...) 获得此信息。顺便说一句,WINHTTP_CALLBACK_STATUS_SENDING_REQUEST 现在似乎也已被弃用,没有明显的替代品可用:-(
    • 你不需要实现sha1函数。相反,请使用此 API CertGetCertificateContextProperty(pCertContext, CERT_HASH_PROP_ID, thumbprint, &thumbprint_size) 获取指纹,即 SHA1 哈希。
    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2017-11-14
    • 2022-12-16
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多