【问题标题】:vb6 winhhtp: Error Occurred in the Secure Channel Supportvb6 winhhtp:安全通道支持中发生错误
【发布时间】:2015-06-23 15:29:00
【问题描述】:

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

【问题讨论】:

  • 请告诉我们您是否成功地纠正了该问题,或者您是否找到了导致错误的确切原因。谢谢!

标签: ssl vb6 winhttp


【解决方案1】:

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) 已禁用/缺少 CSP没有 CSP 提供对所需密码的支持

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

我不知道 Windows 2000 上可用密码的确切列表与 Windows XP 上可用密码之间的详细区别。嗯,我知道 AES 支持是在 Windows XP 和 Windows Server 2003 中引入的,并且 SHA-2 支持(使用 CryptoAPI 进行散列,而不是那些用于 TLS 的 SHA-2 证书)是作为 Windows XP 的一部分引入的SP3。至于 Windows 2000,MSDN 页面 Cipher Suites in Schannel 没有说明任何关于 Windows 2000 的信息,但是 Windows 2000 中包含的 CSP 列表可以在页面 Microsoft CryptoAPI and Cryptographic Service Providers 中找到。更多研究可能会为您提供有关 Windows 2000 支持和不支持的更多详细信息。

如果错误确实与已安装/可用的 CSP 有关,那么 Windows 2000 和 Windows XP 之间的差异将意味着以下三种情况之一:a) 密码或密码套件,两者都可用Windows 2000 和 Windows XP,已在该/那些 Windows 2000 机器上禁用 Schannel;阅读How to restrict the use of certain cryptographic algorithms and protocols in Schannel.dll 以了解哪些注册表项用于禁用密码/密码套件,因此您可以检查是否是这种情况。 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)的支持。如果您还不知道, Windows 操作系统支持 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 品种,因此 预计 Windows 下 WinHttp 的 HTTPS 连接失败会更多XP 和 Windows Vista。毕竟,这是有道理的;对 Windows XP 的支持终于在 2014 年 4 月 8 日结束(微软已经dropped support for Windows Vista),最后一个不支持 TLS 1.1 和 1.2 的 Windows 操作系统 Windows Server 2008 在今年 1 月结束了对主流的支持。

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

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

【讨论】:

  • Vista 支持将持续到 2017 年。
  • @Bob77:感谢您澄清我的观点。你是对的,我应该写的是,Windows Vista 已经在 2012 年结束了对主流的支持。因为在 Windows Vista 中提供对 TLS 1.1 或 TLS 1.2 的支持相当于向操作系统添加了一项功能(以非安全更新),除非您通过 Premier Support 签订了扩展修补程序支持协议,否则您可能永远不会看到任何支持。
  • 好点。有了这样的政策,我不确定我们是否敢再次信任 Microsoft 的 SSL/TLS 支持。
  • 感谢@johnwait 详细而彻底的回复。 1. 启用 SSL 3.0 和 TLS 1.0 没有帮助。 2. 我尝试按照说明启用 CSP,但support.microsoft.com/en-us/kb/245030 中提到的注册表值 DisabledByDefault 不存在。看起来我必须接受我的程序无法在 Windows 2000 上以这种方式运行,我必须:1)尝试 .NET 代码,看看它是否可以工作 2)移动我的程序以在运行的 PC 上运行更高版本的操作系统并让 Windows 2000 PC 通过该 PC 发送请求。
  • @yaronkl 我会给你两个可用于测试的 URL,以防你想进一步诊断问题:1)SSL Server Test, by Qualys SSL Labs:对任何受 SSL 保护的 Web 服务器进行深入分析并生成一份报告,其中包括我们在您的情况下需要的服务器支持的协议(例如 SSL 2/3、TLS 1.0/1.1/1.2)和密码套件 可用。 2) Symantec SHA256 SSL Test Page :赛门铁克提供的页面,用于测试客户端(浏览器)是否支持 SHA-2 (SHA256/384/512) 作为签名算法。
猜你喜欢
  • 2017-10-18
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 2012-10-07
  • 2018-02-13
  • 1970-01-01
相关资源
最近更新 更多