我正在尝试连接到服务器端用Java语言编写的Web服务。我的程序是在客户端用VB.NET 4.0编写的。
当我尝试从Web服务调用任何方法时,我收到以下错误消息:
WS-Metadata Exchange错误URI:[http://...]元数据包含无法解析的引用。请求已中止:无法创建SSL / TLS安全通道
我正在使用证书连接到Web服务,但问题似乎是我的主机(客户端)和服务器之间的通信级别。我正在使用的证书从未被检查为客户端,服务器甚至无法通信。
我试图将安全协议设置为“SSLv3”或“TLS12”,但它没有帮助。提前感谢您的任何建议。
另外我应该提一下,我设法使用Java类连接到此Web服务。似乎当客户端用Java编写时它可以工作,但是当它在VB.NET中时它不起作用。
P上。 HAB
已编辑:
我使用“Wireshark”来发现我的程序发送和接收的HTTPS数据包,这是我在传输的数据包中找到的:
客户要求:
Secure Sockets Layer
TLSv1 Record Layer: Handshake Protocol: Client Hello
Content Type: Handshake (22)
Version: TLS 1.0 (0x0301)
Length: 140
Handshake Protocol: Client Hello
Handshake Type: Client Hello (1)
Length: 136
Version: TLS 1.0 (0x0301)
Random
Session ID Length: 0
Cipher Suites Length: 24
Cipher Suites (12 suites)
Compression Methods Length: 1
Compression Methods (1 method)
Extensions Length: 71
Extension: server_name
Extension: elliptic_curves
Extension: ec_point_formats
Extension: Extended Master Secret
Extension: renegotiation_info
来自服务器的响应:
Secure Sockets Layer
TLSv1 Record Layer: Alert (Level: Fatal, Description: Handshake Failure)
Content Type: Alert (21)
Version: TLS 1.0 (0x0301)
Length: 2
Alert Message
Level: Fatal (2)
Description: Handshake Failure (40)
我尝试将安全协议更改为不同版本的SSL / TLS,但它没有改变任何内容。我的客户端尝试发送带有标准值的“客户端问候”(未指定用户自定义参数),但服务器不接受它。有什么建议吗?
答案 0 :(得分:0)
找到解决方案:
问题实际上与Cipher套件有关,特别是 RC4 算法。实际上我的客户端是用VB.NET 4.0编写的,在这个版本的.NET中,在#34; Hello Client"中,.NET框架仍然支持并提议使用不推荐的RC4算法。 (握手)过程。
我的客户端在受支持的密码套件列表中唯一存在的RC4密码套件正在使服务器中止连接,并显示以下错误消息:"请求已中止:无法创建SSL / TLS安全通道"
所以我必须通过使用regedit.exe进入系统注册表来停用客户端计算机上的RC4密码套件,并将以下密钥添加到这两个指定的路径中:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 " SchUseStrongCrypto" = DWORD:00000001
并且
HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 " SchUseStrongCrypto" = DWORD:00000001
重新启动客户端计算机后,我能够成功连接到Web服务。
有关已弃用的RC4算法的更多信息:
https://technet.microsoft.com/en-us/library/security/2960358.aspx
=>此外,您应该注意到此问题仅存在于.NET 4.0-4.5中。从版本4.6及以上版本开始工作正常。