无法为 SOAP 调用建立 SSL/TLS 安全通道
Posted
技术标签:
【中文标题】无法为 SOAP 调用建立 SSL/TLS 安全通道【英文标题】:Could not establish secure channel for SSL/TLS for SOAP call 【发布时间】:2011-04-28 08:21:21 【问题描述】:我们的核心服务器正在多个不同服务器上通过 https 调用一个肥皂网络服务,以确认交易已完成。
代码是 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 颁发的证书,所以我认为这里不是这种情况。
【问题讨论】:
【参考方案1】:事实证明,这是生产“核心”服务器(调用服务的服务器)和目标服务器(托管服务)之间的交互,不共享可接受的 https 算法。 wfetch 对诊断问题非常有帮助。
原来目标服务器没有设置为接受 TLS 1.0,只接受了 SSL 3.0。
显然,Windows 2008 Server 中发生了一些变化,这意味着出站 https 连接只能使用 TLS 1.0(或者更好,大概是)。
在我们的例子中,当目标服务器上的配置更改为接受 TLS 时,问题就解决了。感觉应该有一种方法可以改变我的程序以强制它使用 SSL,但我还没有找到它。
【讨论】:
在升级 OpenSSL 最新版本以支持 RFC 5746 后,我在 .Net 上遇到了这个问题。出于某种原因,一旦在目标服务器上安装了该补丁,.Net 将不会使用 SSLv3。谢谢指点! 我认为我们遇到了同样的问题。我在找出如何启用 TLS 时遇到了一些问题。你也许有一个起点?我尝试在注册表中添加一些东西,重新启动服务器。错误仍然存在。所有证书均有效。 @TweeZz:你应该问一个单独的问题。您可以包含指向此链接的链接。 我创建了一个问题:***.com/questions/9800947/…【参考方案2】:在客户端,尝试:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
【讨论】:
【参考方案3】:我遇到了同样的错误“无法为具有权限‘www.xyzzy.com’的 SSL/TLS 建立安全通道。”将包含所需客户端证书的现有应用程序从一台服务器移动到另一台服务器时。导致新服务器出现问题的原因是 IIS 用户(在本例中为“IIS_WPG”)没有刚刚移动到新服务器的证书的读取和执行权限。可以使用 wsetools 更改证书访问权限。 /斯蒂芬
【讨论】:
以上是关于无法为 SOAP 调用建立 SSL/TLS 安全通道的主要内容,如果未能解决你的问题,请参考以下文章
在特定服务器上调用 WCF 服务时,“无法为具有权限的 ssl/tls 建立安全通道”
无法使用来自 IIS 的权限为 SSL/TLS 建立安全通道
WCF 无法为具有权限的 SSL/TLS 安全通道建立信任关系