无法为SOAP调用建立SSL / TLS的安全通道

时间:2010-10-20 23:52:40

标签: .net vb.net wcf soap ssl

我们的核心服务器在许多不同的服务器上通过https呼叫soap web服务,以确认交易已完成。

代码是dotnet 3.5(vb),适用于我们设置的各种回调服务,直到我们刚刚将新的一个转移到生产中并拒绝通信,发出以下错误:

Unhandled Exception: System.ServiceModel.Security.SecurityNegotiationException:
Could not establish secure channel for SSL/TLS with authority 'www.xyzzy.com'.
---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

相关的代码片段似乎是:

Dim epAddr As New System.ServiceModel.EndpointAddress(sys.CallbackAddress)
Dim bind As New System.ServiceModel.BasicHttpBinding(ServiceModel.BasicHttpSecurityMode.Transport)

_svc = New CallbackSvc.XyzzyCallbackSoapClient(bind, epAddr)

从我的个人笔记本电脑(WinXP),我可以运行代码并连接到新服务器而不会出现问题。

从主服务器(调用所有回调服务)(Windows Server Enterprise Service Pack 1),代码始终会导致上述SSL错误。

在谷歌上搜索该问题后,我尝试添加以下行(当然不适合制作,但我想测试):

System.Net.ServicePointManager.ServerCertificateValidationCallback = Function(se As Object, cert As System.Security.Cryptography.X509Certificates.X509Certificate, chain As System.Security.Cryptography.X509Certificates.X509Chain, sslerror As System.Net.Security.SslPolicyErrors) True

结果是一样的。 SSL错误仍然存​​在。

其他地方建议根证书未在呼叫计算机上正确安装,但新服务器和旧回调服务器都使用Go Daddy颁发的证书,所以我不认为这是这种情况。

3 个答案:

答案 0 :(得分:9)

这结果是生产“核心”服务器(调用服务的服务器)和目标服务器(托管服务)之间没有共享可接受的https算法的交互。 wfetch对诊断问题非常有帮助。

事实证明,目标服务器未设置为接受TLS 1.0,只接受了SSL 3.0。

显然,在Windows 2008 Server中发生了一些变化,这意味着只有使用TLS 1.0(或者更好,大概是)可以接受出站https连接。

在我们的示例中,当目标服务器上的配置更改为接受TLS时,问题已得到解决。感觉应该有一种方法可以改变我的程序以强制它使用SSL,但我还没有找到它。

答案 1 :(得分:6)

在客户端,尝试:

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

答案 2 :(得分:3)

我收到了同样的错误“无法为权限'www.xyzzy.com'建立SSL / TLS的安全通道。”将包含所需客户端证书的现有应用程序从一个服务器移动到另一个服导致新服务器出现问题的原因是IIS用户(在本例中为“IIS_WPG”)没有读取&执行刚刚移动到新服务器的证书的权限。可以使用wsetools更改证书访问权限。 /斯蒂芬