我有一个简单的web服务调用,由。net (c#) 2.0 Windows应用程序生成,通过Visual Studio生成的web服务代理,用于同样用c#(2.0)编写的web服务。这种方法已经有效了好几年,并且在十几个正在运行的地方继续有效。

在新地点的新安装遇到了问题。当试图调用web服务时,它失败了,消息说:

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

web服务的URL使用SSL (https://)——但这已经在许多其他位置工作了很长时间(并继续这样做)。

我该往哪里看?这可能是Windows和。net之间的安全问题,是此安装独有的吗?如果是,我在哪里建立信任关系?我迷路了!


当前回答

“一网打尽”的简单解决方案是:

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

sebastian-castaldi的解决方案更详细一些。

其他回答

对于那些通过VS客户端遇到这个问题的人,一旦成功添加了一个服务引用,并试图执行第一个调用,就会得到这个异常: "底层连接已关闭:无法为SSL/TLS安全通道建立信任关系" 如果你正在使用(就像我的例子)一个带有IP地址的端点URL并得到了这个异常,那么你可能需要重新添加服务引用,执行以下步骤:

在Internet Explorer上打开端点URL。 点击证书错误(地址栏中的红色图标) 单击查看证书。 获取颁发给:“name”并替换IP地址或任何我们正在使用的名称,并得到这个“name”的错误。

再试一次:)。 谢谢

在我的情况下,我试图在Visual Studio环境中使用IIS 7测试SSL。

这是我最后做的让它工作:

在我的网站的“绑定…”在IIS中,我必须添加“https”绑定到端口443,并选择“IIS Express development Certificate”。 在我的网站的“高级设置…”我必须将“启用的协议”从“http”更改为“https”。 在“SSL设置”图标下,我选择了客户端证书的“接受”。 然后我不得不回收应用程序池。 我还必须使用mmc.exe将本地主机证书导入我的个人存储。

我的网络。配置文件已经正确配置,所以在我把上面所有的东西都整理好之后,我就可以继续测试了。

如果您不想盲目地信任所有人,只对某些主机设置信任例外,那么下面的解决方案更合适。

public static class Ssl
{
    private static readonly string[] TrustedHosts = new[] {
      "host1.domain.com", 
      "host2.domain.com"
    };

    public static void EnableTrustedHosts()
    {
      ServicePointManager.ServerCertificateValidationCallback = 
      (sender, certificate, chain, errors) =>
      {
        if (errors == SslPolicyErrors.None)
        {
          return true;
        }

        var request = sender as HttpWebRequest;
        if (request != null)
        {
          return TrustedHosts.Contains(request.RequestUri.Host);
        }

        return false;
      };
    }
}

那就打电话给Ssl。当你的应用启动时启用托管主机。

如果你使用的是Windows 2003,你可以这样做:

Open Microsoft Management Console (Start --> Run --> mmc.exe); Choose File --> Add/Remove Snap-in; In the Standalone tab, choose Add; Choose the Certificates snap-in, and click Add; In the wizard, choose the Computer Account, and then choose Local Computer. Press Finish to end the wizard; Close the Add/Remove Snap-in dialog; Navigate to Certificates (Local Computer) and choose a store to import: If you have the Root CA certificate for the company that issued the certificate, choose Trusted Root Certification Authorities; If you have the certificate for the server itself, choose Other People Right-click the store and choose All Tasks --> Import Follow the wizard and provide the certificate file you have; After that, simply restart IIS and try calling the web service again.

参考:http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services: -Could-not-establish-trust-relationship-for-the-SSL / TLS -…

添加:

 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;}

就在你呼叫服务之前