获取服务器在自定义证书\u验证\u回调中发送的openssl x509证书链

获取服务器在自定义证书\u验证\u回调中发送的openssl x509证书链,openssl,certificate,x509,schannel,Openssl,Certificate,X509,Schannel,我正在考虑使用Windows系统存储(via)覆盖默认的证书验证过程。该应用程序是一个web客户端,我需要接受添加到系统存储的公司范围的自签名证书 一旦我有了一条(可能是不完整的)链条,我 创建内存中WinCrypt存储 向其中添加服务器提供的链(最终证书除外) 使用WinCrypt从临时存储区和系统存储区构建完整的链 使用WinCrypt验证链(从SSL对象传递servername值) 但返回可信链,该链仅在运行后可用 我需要的是X509_STORE_CTX::untrusted(它只有握

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

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

  • 创建内存中WinCrypt存储
  • 向其中添加服务器提供的链(最终证书除外)
  • 使用WinCrypt从临时存储区和系统存储区构建完整的链
  • 使用WinCrypt验证链(从SSL对象传递servername值)
但返回可信链,该链仅在运行后可用

我需要的是X509_STORE_CTX::untrusted(它只有握手时的证书),但它显然不是通过API导出的

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


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

据我所知,默认的验证函数是X509_verify\u cert。如果不设置自己的验证回调(使用
SSL\u CTX\u set\u cert\u verify\u回调
),则调用此函数。它在crypto/x509/x509\u vfy.c中定义。我建议您查看此函数的源代码,以确定您应该如何说服OpenSSL进行协作(例如正确返回错误代码)

我希望这有帮助

附言。 看起来你是对的:
X509\u STORE\u CTX::untrusted
有to accessor函数,所以它可能是OpenSSL的“私有”东西。在
X509\u verify\u cert
中,直接访问此变量