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

时间:2013-01-16 19:29:40

标签: openssl certificate x509 schannel

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

1 个答案:

答案 0 :(得分:0)

据我所知,默认验证功能是 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中,只需直接访问此可变数据。