4

我正在考虑使用使用 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,但我宁愿不这样做。

4

1 回答 1

2

据我所知,默认验证功能是X509_verify_cert。如果您没有设置自己的验证回调(使用SSL_CTX_set_cert_verify_callback),则会调用此函数。它在crypto/x509/x509_vfy.c中定义。我建议您查看此函数的源代码,以确定您应该做什么来说服 OpenSSL 进行协作(例如正确返回错误代码)。

我希望这会有所帮助。

PS看起来你是对的:有访问器函数X509_STORE_CTX::untrusted,所以它可能是OpenSSL的“私有”东西。在X509_verify_certthis 变量中只是直接访问。

于 2013-01-16T22:53:49.743 回答