【发布时间】:2014-04-04 08:30:08
【问题描述】:
我目前正致力于将第三方 API 集成到我们的软件中。其中一项要求是在 SSL/TLS 上使用 OAuth 样式的身份验证系统。
这不是问题,它工作了大约一天半。然后突然之间,它开始不断地向我返回此错误,即使在尝试进行身份验证时也是如此。
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
事实上它正在工作,但现在它并没有让我感到困惑,我什至不知道从哪里开始寻找解决这个问题。
所涉及的方法是从托管在 HTTPS 环境中的 WCF 服务调用的。我们有来自提供商的有效签名证书。实现中没有任何变化,它只是停止工作。
对于为什么我们会收到这样的错误,你们有什么建议吗?我什至不知道从哪里开始寻找。
更新
证书存在于受信任的存储中。
我们目前的网站为 www.mywebsite.co.uk,并带有该网站的有效证书。我们的服务位于 www.mywebsite.co.uk/Services。
我们还使用 Windows 服务,该服务使用位于 www.mywebsite.co.uk/Services 的相应 WCF。可能是导致问题的 Windows 服务吗? Windows 服务应用程序位于托管服务器上,即 Windows Server 2012。
更新 2
为了解决此问题,我们决定使用该方法忽略证书验证错误。这段代码摘录可以在此处的大量其他文章中找到,但无论如何,任何读者都可以在这里找到。
ServicePointManager.ServerCertificateValidationCallback = (obj, certificate, chain, errors) => true;
更新 3
好的,经过一番查看后,我设法从 ServerCertificateValidationCallback 中获取了这些错误。它告诉我有这个错误
RemoteCertificateNameMismatch
我们尝试访问以进行 API 调用的服务器有一个奇怪的网址,它与证书的颁发者/主题不匹配。这就是把它扔掉的原因吗?
【问题讨论】:
-
检查证书并检查根证书是否在您的信任存储中。
-
我已将证书添加到根存储以及域中。没有效果。我也更新了我的答案。
-
您使用的是 Fiddler 还是其他解密 SSL 的代理?如果发生这种情况,您的代码会看到代理的证书,而不是目标服务器的证书。此外,如果信任链中的任何证书无效,则无论您是否将其放在受信任的存储中,您的证书都不再有效。禁用验证不是您可以部署到生产环境的解决方案。记住最近的 Safari 漏洞。
-
啊,好吧,如果我使用 Fiddler 并且这会以某种方式更改证书信任链,这会导致此错误吗?
-
使用 ServicePointManager.ServerCertificateValidationCallback 并检查错误是什么,而不是仅仅返回 true,这样您就可以看到错误。还要在 WCF 服务上运行详细跟踪,这可能会为您指明正确的方向