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

vb6 winhhtp: Error Occurred in the Secure Channel Support

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

最近服务器提供商通知我他们将“逐步停止支持 SHA-1 安全证书”,我需要“检查指纹是否可用与 SHA-2 新 SSL 证书对齐。".

现在的情况是,当我的程序在 WinXP,7,8 上运行时 - 它仍然可以。但是当 运行 on Windows 2000 时,当我调用 winhttp Send() 方法时,我得到一个异常 "Error Occurred in the Secure Channel Support".

我对证​​书等一无所知,我真的不知道该怎么做。

我的 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时出现错误

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

现在,在你的情况下,有几个原因可以解释这个错误,但由于连接到有问题的服务器在 Windows 2000 上失败时仍然可以在 Windows XP 下工作,我不知道不认为这个失败与那些 SHA-2 签名有关(还)。 [最后更详细]

1) 禁用 SSL 3.0 或 TLS 1.0

我要检查的第一件事:从控制面板打开 "Internet Options",切换到 "Advanced" 选项卡,并在选项中确保选中 SSL 3.0 和 TLS 1.0。如果您必须勾选两者中的任何一个,则需要重新启动。然后再次检查。 (之后,如果仍然失败,您可以随意禁用 SSL 3.0,即因为 POODLE)

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

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

我不太清楚 Windows 2000 和 Windows XP 上可用的确切密码列表之间的区别。好吧,我知道 Windows XP 和 Windows Server 2003 引入了 AES 支持和 SHA-2 支持(使用 CryptoAPI 进行散列,而不是那些 SHA-2 TLS 证书) 作为 Windows XP SP3 的一部分引入。至于 Windows 2000,MSDN 页面 Cipher Suites in Schannel doesn't say anything about Windows 2000, but the list of CSPs included with Windows 2000 can be found in the page Microsoft CryptoAPI and Cryptographic Service Providers。更多研究可能会为您提供有关 Windows 2000 支持和不支持的内容的更多详细信息。

如果错误确实与 installed/available CSP 有关,那么 Windows 2000 和 Windows XP 之间的差异将意味着以下三种情况之一:a ) Windows 2000 和 Windows XP 上可用的密码或密码套件,已在 that/those Windows 2000 机器上禁用 Schannel;阅读 How to restrict the use of certain cryptographic algorithms and protocols in Schannel.dll 找出哪些注册表项用于禁用 cipher/cipher 套件,这样您就可以检查是否是这种情况。 b) 一个密码或密码套件,在 Windows 2000 和 Windows XP 上都可用,missing/not 在 that/those Windows 2000台机器;没有简单的方法来检查这一点,但是如果您尝试在每台 Windows 2000 台机器上都遇到连接错误,那么 c) 会更有意义。 c) 一个密码套件,支持服务器所需的至少一种密码 (例如 AES),仅在 Windows XP,不适用于 Windows 2000;如果你仍然坚持使用 WinHttp,那你就倒霉了。

现在您应该对可能导致错误的原因有一些提示(我敢打赌:AES 是最低要求)

关于那些 SHA-2 证书

TLS 1.2 引入了对 SHA-2 签名(取代 SHA-1)的支持。如果您还不知道, Windows OSes 支持 TLS 1.2(因此具有 SHA-2 签名的证书)are Windows 7, Windows Server 2008 R2, Windows 8+ and Windows Server 2012。这当然不会影响大多数应用程序(例如 Chrome 使用 BoringSSL,OpenSSL 的一个分支)除非 它们依赖于 Schannel.dll,如 WinHttp 或大多数其他 Windows 个组件。

SHA-1 证书预计将于 2017 年 1 月 1 日消失。届时,越来越多的服务器会将其证书移植到 SHA-2 品种,因此 预计会有更多 HTTPS 连接失败适用于 Windows XP & Windows Vista 下的 WinHttp。毕竟,这是有道理的;对 Windows XP 的支持终于在 2014 年 4 月 8 日结束(Microsoft 已经 dropped support for Windows Vista),最后 Windows OS 不支持 TLS 1.1 和 1.2,Windows Server 2008,今年 1 月结束了主流支持。

那么,您应该怎么办?:要么停止支持 Windows 2000 和 XP,要么找到使用 SSL/TLS 库的 WinHttp 的替代品,例如OpenSSL,定期更新。也许 libcurl?

最后说明:除非您使用自签名证书或没有服务器有效信任链的证书,否则您真的应该将 WinHttpRequestOption_SslErrorIgnoreFlags 留给 &H0&(否则,使用 SSL/TLS 有什么意义?)