WebException无法为SSL / TLS安全通道建立信任关系

时间:2010-12-20 18:41:08

标签: c# asp.net web-services ssl webexception

我的公司开发了一个.NET Web服务和一个使用该Web服务的客户端DLL。 Web服务通过ssl托管在我们的服务器上,证书由GoDaddy提供并签名。我们在托管环境中有一些客户端在尝试访问我们的Web服务时从客户端DLL收到以下错误消息。

System.Net.WebException底层连接已关闭:无法为SSL / TLS安全通道建立信任关系。

我们的解决方案是让他们在服务器上打开IE,这对很多托管服务来说都是一个挑战,并转到WSDL网址。 IE然后通过安全警报对话框提示他们。它表示证书日期有效且名称与页面名称相匹配,但由您未选择信任的公司发布。当他们单击是继续时,客户端DLL可以成功连接到Web服务并正常运行。

有没有人知道为什么GoDaddy不会出现在有效的发布商名单中?我们运行的所有服务器都将GoDaddy作为有效权限。我猜,出于安全原因,他们已经卸载了GoDaddy的权限,但并不完全相信没有其他潜在的问题。

不幸的是,我没有太多运气试图在本地重新创建它。如果我进入Internet选项并删除GoDaddy权限并点击我们的服务,ssl工作正常。我回到发布者列表中,GoDaddy重新进入。所以我的第二个问题是,你如何摆脱GoDaddy以便我得到无效的证书警告?

好的,最后一个问题。代码中是否有一种方法可以告诉Web服务忽略无效的证书。我已经看过一些以编程方式使用WCF而不是旧的Web服务的帖子。

5 个答案:

答案 0 :(得分:27)

我通过在调用web方法之前添加此行来修复此错误:

System.Net.ServicePointManager.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => { return true; };

答案 1 :(得分:5)

您可能需要在服务器上安装用于签署SSL证书的中间证书。

浏览器将通过检查签署SSL证书的证书链的验证来尝试验证SSL证书。如果服务器未向证书链提供SSL证书,则浏览器可能会拒绝SSL证书。 (Firefox比IE更多的问题)。必须仍然在客户端计算机上安装根证书才能使其工作。

答案 2 :(得分:2)

VB.NET等效于

   System.Net.ServicePointManager.ServerCertificateValidationCallback = Function(senderX, certificate, chain, sslPolicyErrors)
                                                                             Return True
                                                                         End Function

答案 3 :(得分:1)

这实际上更像是一个服务器故障问题,但我会在这里添加一些内容。

Windows计算机通常信任的根证书颁发机构列表会定期更新。这归结为IE的Windows更新。您可以看到MSDN for more information

如果您的客户没有打开Windows更新或者正在忽略Windows更新,这对很多IT部门来说很不常见,那么除了切换SSL提供程序之外,您可以做的事情并不多。

基本上,他们需要获取证书更新,或者您需要切换到有可能被相关计算机信任的证书提供商。通常,这意味着VerisignThawte。第三种选择是您已经关闭的路线:让他们手动信任根CA.

在一天结束时,我讨厌以这种方式更改应用程序的想法,因为有问题的IT部门是白痴,但真正的问题归结为公司希望如何处理这个问题。

答案 4 :(得分:1)

当您在Web服务器上查看该证书的Go Daddy认证路径时,您看到Go Daddy Class xxx还是Starfield Class xxx?

从您的非传统客户端,即Windows Vista以上,Go Daddy认证路径显示了什么?去Daddy Class xxx或Starfield Class xxx?

这些得到警告的客户是他们的遗留客户吗?即WinXP和更老?

根据Windows Vista,根证书更新的工作方式不同。

http://support.microsoft.com/kb/931125

Windows Vista及更高版本上的根证书通过自动根更新机制(即每个根证书)进行分发。当用户访问安全网站(使用HTTPS SSL),读取安全电子邮件(S / MIME)或下载已签名的ActiveX控件(代码签名)并遇到新的根证书时,Windows证书链验证软件检查Microsoft Update以获取根证书。如果找到它,它会下载当前的证书信任列表(CTL),其中包含本程序中所有受信任的根证书的列表,并验证是否在那里列出了根证书;然后,它将指定的根证书下载到系统,并将其安装在Windows受信任的根证书颁发机构存储中。

您可能会发现Web服务器上的Go Daddy认证路径认为它是Starfield Class 2而不是Go Daddy Class 2,因此您安装了错误的根证书。当我在Web服务器上查看时,它没有显示根证书警告,下载并安装Do Daddy class 2根证书并删除Starfield,并且您的问题应该消失。