vb6 winhhtp:安全通道支持中发生错误

时间:2015-04-17 00:05:01

标签: ssl vb6 winhttp

我编写了一个VB6程序,它使用winhttp.dll向/从远程服务器发送和接收消息。它在各种操作系统中运行良好:Windows 2000,WinXP,Win7,Win8。

最近服务器提供商告诉我他们将“逐步取消对SHA-1安全证书的支持”,我需要“检查指纹是否与SHA-2新SSL一致证书。”。

现在发生的事情是,当我的程序在WinXP上运行时,7,8 - 它仍然可以。但是当在Windows 2000上运行时,当我调用winhttp Send()方法时,我得到一个异常“安全通道支持中发生错误”。

我对证书等无能为力,我真的不知道该怎么做。

我的Vb6代码如下所示:

' Connect to server     
Set m_ServerObj = New WinHttpRequest
m_ServerObj.Open "GET", m_ServerURL_SC

' Send request to server
m_ServerObj.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = &H3300 
            'Unknown certification authority (CA) or untrusted root   0x0100
            'Wrong usage                                              0x0200
            'Invalid common name (CN)                                 0x1000
            'Invalid date or certificate expired                      0x2000

m_ServerObj.Send xml

调用Send时出现错误

1 个答案:

答案 0 :(得分:3)

ERROR_WINHTTP_SECURE_CHANNEL_ERROR :这是Schannel.dll遇到SSL版本/功能/密码/密钥长度等时抛出的一般错误。它不理解或支持,或者当服务器(在客户端的情况下)将不会协商客户端支持的任何内容。 WinHttp依赖它(它是操作系统的一部分)来提供对SSL / TLS安全通道的支持。

现在,在你的情况下,有几个原因可以解释这个错误,但是因为连接到有问题的服务器仍然可以在Windows XP上运行,当它在Windows 2000上失败时,我不认为这个失败是相关的(但是)那些SHA-2签名。 [最后详情]

1)禁用SSL 3.0或TLS 1.0

我要检查的第一件事是:打开"互联网选项"从控制面板,切换到"高级"选项卡,并在选项中确保SSL 3.0&检查TLS 1.0。如果您必须勾选其中任何一个,则需要重新启动。然后再检查一下。 (之后,如果它仍然失败,你可以自由禁用SSL 3.0,如果你愿意,因为POODLE)

2)已禁用/缺少CSP 没有CSP为所需的密码提供支持

Schannel.dll利用计算机上安装的不同加密服务提供程序(CSP)提供的可用密码套件。如果没有任何CSP为服务器所需的密码提供支持,则HTTPS连接将失败。

我不详细了解Windows 2000上可用的密码列表与Windows XP上的密码列表之间的区别。好吧,我知道Windows XP&作为Windows XP SP3的一部分,引入了Windows Server 2003 和SHA-2支持(使用CryptoAPI进行散列,而不是使用TLS的SHA-2证书)。对于Windows 2000,MSDN页面Cipher Suites in Schannel并未说明任何关于Windows 2000的内容,但是可以在页面{{3}中找到Windows 2000附带的CSP列表 }。更多的研究可能会为您提供有关Windows 2000支持的内容以及不支持的内容的更多详细信息。

如果错误确实与已安装/可用的CSP有关,那么Windows 2000和Windows XP之间的差异将意味着以下三个方面之一: a)密码或密码套件,两者都可用Windows 2000和Windows XP已在那台/那些Windows 2000机器上为Schannel禁用;阅读Microsoft CryptoAPI and Cryptographic Service Providers以找出用于禁用密码/密码套件的注册表项,以便检查是否属于这种情况。 b) Windows 2000和Windows XP上都提供的密码或密码套件在/那些Windows 2000机器上丢失/未注册;没有简单的方法可以检查这一点,但是如果你在尝试的每台Windows 2000机器上都出现了连接错误,那么c)会更有意义。 c)密码套件,支持服务器所需的至少一个密码(例如AES),仅在Windows XP中引入,不适用于Windows 2000;如果你坚持使用WinHttp,那么你运气不好。

到目前为止,您应该对导致错误的原因提出一些提示(我打赌:AES是最低要求)

关于这些SHA-2证书

TLS 1.2引入了对SHA-2签名(取代SHA-1)的支持。如果您还不知道,支持TLS 1.2的Windows操作系统(以及具有SHA-2签名的证书)How to restrict the use of certain cryptographic algorithms and protocols in Schannel.dll。这当然不应该影响大多数应用程序(例如Chrome使用BoringSSL,一个OpenSSL的分支),除非它们依赖于Schannel.dll,如WinHttp或大多数其他Windows组件。

SHA-1证书预计将在2017年1月1日之前消失。到那时,越来越多的服务器将其证书移植到SHA-2类型,因此期望Windows下WinHttp的HTTPS连接失败更多XP& Windows Vista 。毕竟,这是有道理的; Windows XP的支持终于在2014年4月8日结束(微软已经are Windows 7, Windows Server 2008 R2, Windows 8+ and Windows Server 2012),最后一个Windows操作系统不支持TLS 1.1& 1.2,Windows Server 2008,今年1月已达到主流支持的终点。

那么,你应该怎么做?:要么停止支持Windows 2000& XP,或找到​​使用SSL / TLS库的WinHttp的替代品,例如: OpenSSL,定期更新。也许dropped support for Windows Vista

最终说明:除非您使用自签名证书或没有有效信任链的证书,否则您应该将WinHttpRequestOption_SslErrorIgnoreFlags留给&H0&(否则,使用SSL / TLS的重点是什么?)