我有一个简单的Web服务调用,由.NET(C#)2.0 Windows应用程序通过Visual Studio生成的Web服务代理生成,用于也使用C#(2.0)编写的Web服务 . 这已经工作了几年,并且在它运行的十几个地方继续这样做 .
新站点的新安装遇到问题 . 尝试调用Web服务时,它失败并显示以下消息:
无法为SSL / TLS安全通道 Build 信任关系
Web服务的URL使用SSL(https://) - 但这已经在许多其他位置工作了很长时间(并且仍在继续) .
我在哪里看?这可能是Windows和.NET之间的安全问题吗?如果是这样,我在哪里 Build 信任关系?我迷路了!
15 回答
我刚遇到这个问题 . 我的决心是通过手动同步到时间服务器来更新系统时间 . 为此,您可以:
右键单击任务栏中的时钟
选择
Adjust Date/Time
选择
Internet Time
选项卡点击
Change Settings
选择
Update Now
在我的情况下,这是正确同步所以我必须多次点击它才能正确更新 . 如果它继续不正确地更新,您甚至可以尝试使用服务器下拉列表中的其他时间服务器 .
思考(基于过去的痛苦):
你有服务器的DNS和视线吗?
您是否使用证书中的正确名称?
证书仍然有效吗?
是一个配置不当的负载均衡器弄乱了吗?
新的服务器机器是否正确设置了时钟(即使UTC时间正确[忽略本地时间,这在很大程度上是无关紧要的]) - 这对WCF来说当然很重要,因此可能影响常规SOAP?
是否存在证书信任链问题?如果您从服务器浏览到soap服务,是否可以获得SSL?
与上述相关 - 证书是否已安装到正确的位置? (您可能需要受信任的根证书颁发机构中的副本)
是服务器's machine-level proxy set correctly? (which different to the user'的代理);看看XP / 2003的proxycfg(不确定Vista等)
卢克写了一篇关于这篇文章的相当不错的文章..非常直截了当..试一试
Luke's Solution
原因(引用他的文章(减去诅咒))“..上面代码的问题是,如果你的证书无效,它就不起作用 . 为什么我要发布到有SSL证书无效的网页呢?因为我很便宜而且我不想支付Verisign或其他 **- * s作为我的测试盒的证书,所以我自己签了 . 当我发出请求时,我得到了一个可爱的例外:
System.Net.WebException 底层连接已关闭 . 无法与远程服务器 Build 信任关系 .
我不了解你,但对我来说,异常看起来像是由于我的代码中的一个愚蠢的错误导致POST失败 . 所以我一直在搜索,调整和做各种奇怪的事情 . 只有在我搜索了***之后,才发现遇到无效SSL证书后的默认行为是抛出这个异常 . ..”
在我的情况下,我试图使用IIS 7在我的Visual Studio环境中测试 SSL .
这就是我最终要做的工作:
在IIS右侧“绑定...”部分的我的站点下,我不得不将“https”绑定添加到端口443并选择“IIS Express开发证书” .
在我的网站右侧的“高级设置...”部分中,我必须将“启用的协议”从“http”更改为“https” .
在“SSL设置”图标下,我为客户端证书选择了“接受” .
然后我不得不回收应用程序池 .
我还必须使用mmc.exe将本地主机证书导入我的个人商店 .
我的
web.config
文件已经正确配置,所以在我完成上述所有操作后,我能够继续测试 .如果您不想盲目地信任每个人并仅对某些主机进行信任例外,则以下解决方案更合适 .
然后在应用启动时调用Ssl.EnableTrustedHosts .
如果您使用的是Windows 2003,则可以尝试以下操作:
参考:http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS- ...
对于那些通过VS客户端遇到此问题的人,一旦成功添加服务引用并尝试执行第一次调用就会遇到此异常:“基础连接已关闭:无法 Build SSL / TLS安全通道的信任关系”如果你正在使用(就像我的情况)一个带有IP地址的 endpoints URL并得到这个例外,那么你可能需要重新添加服务引用来执行这些步骤:
在Internet Explorer上打开 endpoints URL .
点击证书错误(地址栏中的红色图标)
单击查看证书 .
grab 发布到:"name"并替换我们正在使用的IP地址或任何名称,并获取此"name"的错误 .
再试一次 :) . 谢谢
我在Internet Explorer的
.NET
app中遇到了类似的问题 .我解决了将证书(在我的案例中为VeriSign Class 3证书)添加到可信编辑证书的问题 .
转到Internet选项 - >内容 - >发布者并导入它
如果从以下位置导出证书,则可以获取证书:
Internet选项 - >内容 - >证书 - >中级证书颁发机构 - > VeriSign Class 3公共主要证书颁发机构 - G5
试试这个:
请注意,您必须至少使用4.5 .NET框架
以下代码段将修复您正在调用的服务器上的SSL证书有问题的情况 . 例如,它可能是自签名的,或者证书与服务器之间的主机名可能不匹配 .
This is dangerous 如果您在直接控制之外呼叫服务器,因为您无法确定是否正在与您认为已连接的服务器通话 . 但是,如果您正在处理内部服务器并且获得"correct"证书不可行,请使用以下命令告知Web服务忽略证书问题并勇敢地参与其中 .
前两个使用lambda表达式,第三个使用常规代码 . 第一个接受任何证书 . 最后两个至少检查证书中的主机名是否是您期望的主机名 .
...希望你觉得它很有帮助
微软的SSL Diagnostics Tool可能有助于识别问题 .
UPDATE 此链接现已修复 .
非常简单的“全部捕获”解决方案是这样的:
sebastian-castaldi的解决方案更加详细 .
If not work bad sertificate, when ServerCertificateValidationCallback return true; 我的ServerCertificateValidationCallback代码:
我阻止执行ServerCertificateValidationCallback的代码:
OnValidateCertificateError函数:
我禁用了CertificateValidation代码和ServerCertificateValidationCallback运行得非常好
我在使用url的网络服务器上运行此错误,例如:
但它没有证书,所以我得到了一个名为的DNS
只是在这里提示这个解决方案,因为这在谷歌中名列前茅 .
我个人最喜欢以下解决方案:
...然后在您请求获取错误之前,请执行以下操作
咨询后发现这个Luke's Solution