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 的意义何在?)