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

2024-01-10

我编写了一个 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时出现错误


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

现在,就您的情况而言,有几个原因可以解释此错误,但由于在 Windows 2000 上失败时连接到有问题的服务器在 Windows XP 下仍然有效,因此我认为此故障与那些 SHA- 无关(尚) 2个签名。【更多详情见文末】

1) SSL 3.0 或 TLS 1.0 已禁用

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

2) 残疾/缺失 CSPor没有 CSP 为所需的密码提供支持

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

我不知道 Windows 2000 上可用的密码的确切列表与 Windows XP 上可用的密码的确切列表之间的区别。出色地,我知道 Windows XP 和 Windows Server 2003 中引入了 AES 支持和 SHA-2 支持(使用 CryptoAPI 进行散列,而不是用于 TLS 的 SHA-2 证书)作为 Windows XP SP3 的一部分引入。对于 Windows 2000,MSDN 页面斯通道Cipher Suites https://msdn.microsoft.com/en-us/library/windows/desktop/aa374757%28v=vs.85%29.aspx没有提及任何有关 Windows 2000 的内容,butWindows 2000 中包含的 CSP 列表可以在该页面中找到Microsoft CryptoAPI 和加密服务提供商 https://technet.microsoft.com/en-us/library/cc962093.aspx。更多的研究可能会为您提供有关 Windows 2000 支持哪些内容和不支持哪些内容的更多详细信息。

如果错误确实与已安装/可用的 CSP 有关,那么 Windows 2000 和 Windows XP 之间的差异可能意味着以下三种情况之一:a)Windows 2000 和 Windows XP 上都可用的密码或密码套件已在该/那些 Windows 2000 计算机上禁用 Schannel;读如何限制 Schannel.dll 中某些加密算法和协议的使用 https://support.microsoft.com/en-us/kb/245030找出哪些注册表项用于禁用密码/密码套件,以便您可以检查是否是这种情况。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)的支持。如果您还不知道,only支持 TLS 1.2(以及具有 SHA-2 签名的证书)的 Windows 操作系统是 Windows 7、Windows Server 2008 R2、Windows 8+ 和 Windows Server 2012 https://marclsitinfrablog.wordpress.com/windows-sharepoint-articles-posts/windows-support-for-ssltls-versions/。这当然不会影响大多数应用程序(例如 Chrome 使用 BoringSSL,OpenSSL 的一个分支)unless它们依赖于 Schannel.dll,就像 WinHttp 或大多数其他 Windows 组件一样。

SHA-1 证书预计将于 2017 年 1 月 1 日消失。届时,越来越多的服务器将把其证书移植到 SHA-2 类型,因此预计 Windows XP 和 Windows Vista 下 WinHttp 会出现更多 HTTPS 连接失败。毕竟,这是有道理的;对 Windows XP 的支持最终于 2014 年 4 月 8 日结束(微软已经放弃对 Windows Vista 的支持 https://support.microsoft.com/en-us/lifecycle/search/default.aspx?alpha=Vista)以及最后一个不支持 TLS 1.1 和 1.2 的 Windows 操作系统 Windows Server 2008,于今年 1 月结束了主流支持。

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

最后说明:除非您使用自签名证书或没有服务器有效信任链的证书,否则您确实应该离开WinHttpRequestOption_SslErrorIgnoreFlags to &H0&(否则,使用 SSL/TLS 有何意义?)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vb6 winhhtp:安全通道支持中发生错误 的相关文章

随机推荐