浏览器可以访问 Web 服务,但我的 C# 应用出现“无法建立信任关系”

Browser can access web service, but my C# app gets "Could not establish trust relationship"

提问人:Kevin 提问时间:1/26/2012 最后编辑:Edward BreyKevin 更新时间:1/21/2015 访问量:1768

问:

我在 Windows Server 2003 计算机上有一个 C# 控制台应用,该应用将数据(通过 SSL)发送到 Windows Server 2003 R2 计算机上托管的 Web 服务。我在 MMC(Microsoft 管理控制台)中的“当前用户”和“本地计算机”证书存储上都安装了整个证书链。

我可以在IE和Firefox中点击Web服务(.asmx页面)就好了。我假设是因为它使用当前用户证书存储。但是,我的 C# 应用返回以下错误:

System.ServiceModel.Security.SecurityNegotiationException:无法为 SSL/TLS 安全通道建立信任关系 权威“www.samplewebservice.com”。---> System.Net.WebException: 基础连接已关闭:无法建立信任 SSL/TLS 安全通道的关系。---> System.Security.Authentication.AuthenticationException:远程 根据验证过程,证书无效。

这几乎就像证书没有存储在 MMC 中的正确“帐户”或“容器”中一样。我浏览了各种服务帐户,它们似乎都有证书。我知道 .NET 在“NT AUTHORITY\Network Service”帐户下运行,但“Network Service”未列在 MMC 中的“服务帐户”下。我检查了以下服务帐户,它们都具有正确的证书(我从未复制过它们,因此我假设这是因为它们在本地计算机帐户中):

  • 计算机浏览器
  • 网络连接
  • 网络管理器

我完全被难住了。这就像 .NET 无权访问证书一样。我希望我可以使用类似于 Java 的密钥库。有没有人遇到过这种情况?

C# WCF Web 服务 SSL

评论

1赞 jglouie 1/26/2012
您在手动 IE/Firefox 请求中使用的主机 (www.samplewebservice.com) 是否与 C# 请求中的主机 () 完全相同?
0赞 jglouie 1/26/2012
C# 请求是从应用程序还是服务发出的?
0赞 Matthew Abbott 1/26/2012
您已经说过用户和本地,但它们是否在受信任的证书存储中?
0赞 RoccoC5 1/26/2012
正如 jglouie 所提到的,请确保客户端终端节点地址中的域名与证书颁发到的域名匹配。
0赞 anton.burger 1/26/2012
它可能与此问题无关,但看起来您正在对 ASMX 服务使用 WCF 客户端。有什么特别的原因吗?

答:

-1赞 Wiktor Zychla 1/26/2012 #1

在处理管道早期的某个位置:

ServicePointManager.ServerCertificateValidationCallback = (a,b,c,d) => true;

这是为了确保接受所有证书。

当然,正如 John 所指出的,这种通用回调可能很危险,因此请对其进行微调,以便一方面它解决了您的问题,另一方面它不会引入任何安全问题。

我希望约翰现在满意。我应该更健谈,他也应该:)

评论

0赞 Wiktor Zychla 1/26/2012
评分为 1200+ 的提问者可能很清楚可能的后果。一个赤裸裸的“听起来很危险”听起来很不礼貌。它并没有为这个话题增加太多。
2赞 anton.burger 1/26/2012
忽视问题并仅仅丢弃证书验证也不是:P
0赞 John Saunders 1/26/2012
“听起来很危险”对我投反对票的人来说是一个暗示,他应该在答案中解决危险。
0赞 Wiktor Zychla 1/26/2012
一句话对智者来说就足够了。
0赞 user2864740 12/30/2015
虽然在某些情况下这可能是一个答案(例如。“我没有或不关心有效的证书,或者希望以不同的方式处理握手”)这并不能解决当前的问题。
0赞 Ricky Gummadi 1/26/2012 #2

我也有类似的问题。我通过删除证书,重新安装它们并重新启动PC和IIS来解决。此外,请确保您的证书尚未过期,并且在计算机的存储中是受信任的。