我正在考虑使用使用 Windows 系统存储(通过SSL_CTX_set_cert_verify_callback)的一个覆盖默认证书验证过程。该应用程序是一个 Web 客户端,我需要接受添加到系统存储区的公司范围的自签名证书。
一旦我有一个(可能不完整的)链,我
- 创建一个内存中的 WinCrypt 存储,
- 将服务器提供的链(最终证书除外)添加到其中
- 使用 WinCrypt 从临时存储和系统存储中构建完整的链
- 使用 WinCrypt 验证链(从 SSL 对象传递 servername 值)
但是X509_STORE_CTX_get1_chain()返回可信链,它只有在X509_verify_cert()运行后才可用。
我需要的是 X509_STORE_CTX::untrusted (它只有握手的证书),但它显然不是通过 API 导出的。
我可以将最终证书传递给 WinCrypt,但这意味着下载我想避免的中间证书。
我的问题是,我在做一些倒退的事情吗?我应该让 openssl 构建链并进行验证,然后使用 WinCrypt 重做吗?这似乎很恶心。我可以添加一个 X509_STORE_CTX_get_untrusted() 函数并重建 libeay32.dll,但我宁愿不这样做。