使用 WinHTTP API 固定证书

标签 c winapi ssl winhttp

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

最佳答案

(灵感来自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 进行比较。

关于使用 WinHTTP API 固定证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125165/

相关文章:

c - 指针定义上的语法错误似乎有效(来自工作库)SDCC

c++ - 如何获取窗口中的显示数量?

c++ - 如何使用 DirectX 正确组织 Win32 消息处理?

ssl - 无法让 kubernetes 将我的 tls 证书传递给浏览器

php - Magento - 需要为两个页面强制使用 HTTP,而网站的其余部分则强制使用 HTTPS

authentication - 使用 HTTPS 进行客户端-服务器通信

c - 使用 PIC18 将数据保存到外部 EEPROM

c - 在 Linux 上使用套接字发出 https 请求

c - 结构C : Storing values in an array

c++ - 如何从网络摄像头获取原始 mjpg 流