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

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

问题描述:

我的公司开发了一个.NET Web服务和一个使用该Web服务的客户端DLL。 web服务通过ssl托管在我们的服务器上,证书由GoDaddy提供并签名。我们有一些托管环境中的客户端在客户端DLL尝试访问我们的Web服务时收到以下错误消息。WebException无法建立SSL/TLS安全通道的信任关系

System.Net.WebException基础连接已关闭:无法为SSL/TLS安全通道的信任关系。

我们的修复方法是让他们在服务器上打开IE,这对很多托管服务都是一项挑战,并转到WSDL URL。 IE然后用安全警报对话框提示他们。它表示认证日期有效,并且有效的名称与该页面的名称相匹配,但由您没有选择信任的公司颁发。当他们单击是继续时,客户端DLL可以成功连接到Web服务并正常运行。

没有人有任何想法,为什么GoDaddy的不会一直在那里有效的发布者列表?我们运行的所有服务器都有GoDaddy作为有效的权限。我猜,出于安全原因,他们已经卸载了GoDaddy的权限,但并不完全相信没有其他潜在的问题。

不幸的是,我没有多少运气试图在本地重新创建。如果我进入Internet选项并删除GoDaddy权限并启动我们的服务,那么ssl工作得很好。我回到发布商列表中,GoDaddy得到了回归。所以我的第二个问题是,你是如何摆脱GoDaddy,以便我可以得到一个无效的证书警告?

好的,最后一个问题。有没有代码的方式,我可以告诉Web服务忽略无效的证书。我见过一些关于WCF而不是以前的Web服务进行编程的文章。

+0

是解决所严格按照要求的安全证书的DNS?即:'https:// wsdl.companydomain.local'或SSL证书中指定的任何内容。 – 2010-12-20 18:45:28

+0

我相信是的。我在这里验证了我们的证书,http://www.sslshopper.com/ssl-checker.html,并且一切都检查完好。 – 2010-12-20 18:53:34

+0

您一次提问的次数太多。本地计算机和服务器计算机上的受信任根证书列表是一种谨慎保护的资源,不会经常更新。任何人都可以创建新的根证书。 GoDaddy可能已经创建了不在Microsoft通讯组列表中的其他根证书,并且您的SSL证书由其中一个签名。也有可能用于签署SSL证书的根证书已被入侵并置于“不信任”列表中,这意味着您的SSL证书不可信。 – dthorpe 2010-12-20 19:05:25

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

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

+0

我并不是说你错了,但似乎浏览器不应该向服务器询问它的根证书列表......这似乎是一个巨大的安全漏洞。此外,这听起来像有问题的机器不相信GoDaddy作为CA.这意味着浏览器没有列出GoDaddy的受信任根权限列表。唯一的方法是通过微软更新或手动信任它。 – NotMe 2010-12-20 19:00:42

+0

@Chris:SSL安装中的一个常见问题是服务器仅返回叶节点证书,而没有指示证书链。 IE浏览器通常会接受这样的证书,但Firefox不会。安抚Firefox的解决方案是确保您的中间证书在服务器上可用。你可能对根证书是正确的 - 我已经编辑了答案。 – dthorpe 2010-12-20 19:09:05

+0

看起来好多了。+1 – NotMe 2010-12-20 19:14:52

这实际上更像是一个serverfault问题,但我会在这里添加我能做的。

Windows机器通常信任的根证书颁发机构列表会定期更新。这是作为Windows更新到IE浏览器。你可以看到MSDN for more information

如果您的客户没有打开Windows更新或者主动忽略Windows更新,这对于很多IT部门来说非常普遍,那么除了交换机SSL提供商之外,您可以做的不多。

基本上,他们需要获得该证书的更新,或者你需要切换到一个已经被有问题的机器信任的概率高的证书提供商。通常这意味着VerisignThawte。第三种选择是你一直沿着的路线:让他们手动信任根CA.

在这一天结束时,我讨厌这种方式,只是因为所涉及的IT部门是白痴,但真正的问题归结为你的公司想怎么处理这个不断变化的应用程序的想法。

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

从您的非传统客户端,即Windows Vista向上,Go Daddy认证路径显示什么?去爸爸班xxx或星际班xxx?

而这些客户端得到警告,他们是传统客户端吗?即WinXP和更旧?

根证书更新的作用与Windows Vista不同。在Windows Vista上

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

的根证书,后来通过自动根更新机制分布 - 即每根证书。当用户访问安全网站(通过使用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 root cert并删除Starfield one,并且您的问题应该消失。

我通过调用Web方法之前加入这一行修正了这个错误:

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

尽管这不是理想的解决方案,但如果您使用的是无效的ssl(在某些情况下可能无法避免),这可能是一种可接受的解决方法,让您了解您正在做的事情。 – 2014-02-18 04:09:14

+1

这不可能是一个解决方案,除非您添加自定义逻辑来验证您的证书。你不能只接受产品中的任何证书。如果您忽略了证书验证并接受任何证书,则使用SSL/TLS毫无意义。 – 2015-08-04 14:50:35

+0

同意麦克斯关于不在prod中这样做的评论,但这个解决方案为我节省了时间,只用于我正在使用的仅供内部使用的实用程序。小心一点。 – BitsEvolved 2016-05-12 15:25:47

VB.NET相当于是

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