Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl vb6 winhhtp:安全通道支持中出现错误_Ssl_Vb6_Winhttp - Fatal编程技术网

Ssl vb6 winhhtp:安全通道支持中出现错误

Ssl vb6 winhhtp:安全通道支持中出现错误,ssl,vb6,winhttp,Ssl,Vb6,Winhttp,我编写了一个VB6程序,它使用winhttp.dll向远程服务器发送和接收消息。它在各种操作系统上运行良好:Windows 2000、WinXP、Win7、Win8 最近,服务器提供商通知我,他们将“逐步取消对SHA-1安全证书的支持”,我需要“检查指纹是否与SHA-2新SSL证书对齐” 现在发生的事情是,当我的程序在WinXP上运行时,7,8-仍然可以。但是在Windows 2000上运行时,当我调用winhttp Send()方法时,我得到一个异常“安全通道支持中发生错误” 我对证书等一无所

我编写了一个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\u WINHTTP\u SECURE\u CHANNEL\u error:这是在Schannel.dll遇到SSL版本/功能/密码/密钥长度等时引发的一般错误。它不理解或不支持,或者在服务器(对于客户端)运行时引发的错误不会就客户支持的任何内容进行协商。WinHttp依靠它(它是操作系统的一部分)提供对SSL/TLS安全通道的支持

现在,在你的例子中,有几个原因可以解释这个错误,但是由于连接到有问题的服务器在Windows XP下仍然可以工作,当它在Windows 2000上出现故障时,我认为这个故障与那些SHA-2签名无关。[最后有更多细节]

1)禁用SSL 3.0或TLS 1.0

我要检查的第一件事是:从控制面板打开“Internet选项”,切换到“高级”选项卡,并在选项中确保选中了SSL 3.0和TLS 1.0。如果必须勾选这两个选项中的任何一个,则需要重新启动。然后再检查一遍。(之后,如果仍然失败,您可以自由禁用SSL 3.0,如果您愿意,也就是说,因为狮子狗)

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页面没有说明任何有关Windows 2000的内容,但是可以在该页面中找到Windows 2000附带的CSP列表。更多的研究可能会给你更多关于Windows 2000支持什么和不支持什么的细节

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

到现在为止,您应该已经知道了一些可能导致错误的线索(我打赌:AES是最低要求)

关于那些SHA-2证书

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

SHA-1证书预计将于2017年1月1日前失效。到那时,越来越多的服务器将其证书移植到SHA-2版本,因此预计在Windows XP和Windows Vista下WinHttp会出现更多HTTPS连接故障。毕竟,这是有道理的;对Windows XP的支持终于在2014年4月8日结束(微软已经停止了),最后一个不支持TLS 1.1和1.2的Windows操作系统Windows Server 2008于今年1月结束了主流支持

那么,您应该怎么做?停止支持Windows 2000和XP,或者寻找使用SSL/TLS库(如OpenSSL)的WinHttp的替代品,定期更新。也许吧


最后一点:除非您使用自签名证书或没有有效的服务器信任链的证书,否则您确实应该将
WinHttpRequestOption\u sslerorIgnoreFlags
留给
&H0&
(否则,使用SSL/TLS有什么意义?)

Vista支持将持续到2017年。@Bob77:感谢您澄清我的观点。你们说得对,我应该写的是Windows Vista已经在2012年达到了主流支持的尽头。由于在Windows Vista中提供对TLS 1.1或TLS 1.2的支持相当于在操作系统中添加一项功能(以非安全更新的形式),因此,除非您通过Premier support签订了扩展的修补程序支持协议,否则您可能永远看不到对这两项功能的支持。这一点很好。有了这样的政策,我不确定我们是否敢这样做