获取服务器在自定义cert_verify_callback中发送的openssl x509证书链

问题描述 投票:4回答:1

我正在考虑使用Windows系统存储库(通过SSL_CTX_set_cert_verify_callback)覆盖默认的证书验证过程。该应用程序是一个Web客户端,我需要接受添加到系统存储中的全公司范围的自签名证书。

一旦我有了一个(可能不完整的)链,我

  • 创建内存中的WinCrypt存储,
  • 向其添加服务器提供的链(最终证书除外)
  • 使用WinCrypt从临时存储和系统存储中构建完整的链
  • 使用WinCrypt验证链​​(从SSL对象传递服务器名值)

但是X509_STORE_CTX_get1_chain()返回受信任的链,只有在X509_verify_cert()运行之后才能使用。

我需要的是X509_STORE_CTX ::: untrusted(仅包含来自握手的证书),但显然没有通过API导出。

我可以将最终证书传递给WinCrypt,但这意味着要下载我要避免的中间证书。

我的问题是,我是否正在做一些倒退?我应该让openssl构建链并进行验证,然后使用WinCrypt重做吗?好像很恶心我可以添加X509_STORE_CTX_get_untrusted()函数并重建libeay32.dll,但我宁愿不这样做。

openssl certificate x509 schannel
1个回答
2
投票

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

我希望有帮助。

P.S。看起来您是对的:X509_STORE_CTX::untrusted具有访问器函数,因此它可能是OpenSSL的“私有”内容。在X509_verify_cert中,可以直接直接访问此变量。

© www.soinside.com 2019 - 2024. All rights reserved.