首页 文章

无法为SSL / TLS安全通道 Build 信任关系 - SOAP

提问于
浏览
295

我有一个简单的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 回答

  • 6

    我刚遇到这个问题 . 我的决心是通过手动同步到时间服务器来更新系统时间 . 为此,您可以:

    • 右键单击任务栏中的时钟

    • 选择 Adjust Date/Time

    • 选择 Internet Time 选项卡

    • 点击 Change Settings

    • 选择 Update Now

    在我的情况下,这是正确同步所以我必须多次点击它才能正确更新 . 如果它继续不正确地更新,您甚至可以尝试使用服务器下拉列表中的其他时间服务器 .

  • 30

    思考(基于过去的痛苦):

    • 你有服务器的DNS和视线吗?

    • 您是否使用证书中的正确名称?

    • 证书仍然有效吗?

    • 是一个配置不当的负载均衡器弄乱了吗?

    • 新的服务器机器是否正确设置了时钟(即使UTC时间正确[忽略本地时间,这在很大程度上是无关紧要的]) - 这对WCF来说当然很重要,因此可能影响常规SOAP?

    • 是否存在证书信任链问题?如果您从服务器浏览到soap服务,是否可以获得SSL?

    • 与上述相关 - 证书是否已安装到正确的位置? (您可能需要受信任的根证书颁发机构中的副本)

    • 是服务器's machine-level proxy set correctly? (which different to the user'的代理);看看XP / 2003的proxycfg(不确定Vista等)

  • 3

    卢克写了一篇关于这篇文章的相当不错的文章..非常直截了当..试一试

    Luke's Solution

    原因(引用他的文章(减去诅咒))“..上面代码的问题是,如果你的证书无效,它就不起作用 . 为什么我要发布到有SSL证书无效的网页呢?因为我很便宜而且我不想支付Verisign或其他 **- * s作为我的测试盒的证书,所以我自己签了 . 当我发出请求时,我得到了一个可爱的例外:

    System.Net.WebException 底层连接已关闭 . 无法与远程服务器 Build 信任关系 .

    我不了解你,但对我来说,异常看起来像是由于我的代码中的一个愚蠢的错误导致POST失败 . 所以我一直在搜索,调整和做各种奇怪的事情 . 只有在我搜索了***之后,才发现遇到无效SSL证书后的默认行为是抛出这个异常 . ..”

  • 0

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

    这就是我最终要做的工作:

    • 在IIS右侧“绑定...”部分的我的站点下,我不得不将“https”绑定添加到端口443并选择“IIS Express开发证书” .

    • 在我的网站右侧的“高级设置...”部分中,我必须将“启用的协议”从“http”更改为“https” .

    • 在“SSL设置”图标下,我为客户端证书选择了“接受” .

    • 然后我不得不回收应用程序池 .

    • 我还必须使用mmc.exe将本地主机证书导入我的个人商店 .

    我的 web.config 文件已经正确配置,所以在我完成上述所有操作后,我能够继续测试 .

  • 1

    如果您不想盲目地信任每个人并仅对某些主机进行信任例外,则以下解决方案更合适 .

    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.EnableTrustedHosts .

  • 2

    如果您使用的是Windows 2003,则可以尝试以下操作:

    打开Microsoft管理控制台(开始 - >运行 - > mmc.exe);选择“文件” - >“添加/删除管理单元”;在“独立”选项卡中,选择“添加”;选择“证书”管理单元,然后单击“添加”;在向导中,选择“计算机帐户”,然后选择“本地计算机” . 按“完成”结束向导;关闭“添加/删除管理单元”对话框;导航到“证书(本地计算机)”并选择要导入的存储:如果您拥有颁发证书的公司的根CA证书,请选择“受信任的根证书颁发机构”;如果您拥有服务器本身的证书,请选择“其他人”右键单击该存储,然后选择“所有任务” - >导入按照向导并提供您拥有的证书文件;之后,只需重新启动IIS并尝试再次调用Web服务 .

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

  • 7

    对于那些通过VS客户端遇到此问题的人,一旦成功添加服务引用并尝试执行第一次调用就会遇到此异常:“基础连接已关闭:无法 Build SSL / TLS安全通道的信任关系”如果你正在使用(就像我的情况)一个带有IP地址的 endpoints URL并得到这个例外,那么你可能需要重新添加服务引用来执行这些步骤:

    • 在Internet Explorer上打开 endpoints URL .

    • 点击证书错误(地址栏中的红色图标)

    • 单击查看证书 .

    • grab 发布到:"name"并替换我们正在使用的IP地址或任何名称,并获取此"name"的错误 .

    再试一次 :) . 谢谢

  • 14

    我在Internet Explorer的 .NET app中遇到了类似的问题 .

    我解决了将证书(在我的案例中为VeriSign Class 3证书)添加到可信编辑证书的问题 .

    转到Internet选项 - >内容 - >发布者并导入它

    如果从以下位置导出证书,则可以获取证书:

    Internet选项 - >内容 - >证书 - >中级证书颁发机构 - > VeriSign Class 3公共主要证书颁发机构 - G5

  • 151

    试试这个:

    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
    

    请注意,您必须至少使用4.5 .NET框架

  • 1

    以下代码段将修复您正在调用的服务器上的SSL证书有问题的情况 . 例如,它可能是自签名的,或者证书与服务器之间的主机名可能不匹配 .

    This is dangerous 如果您在直接控制之外呼叫服务器,因为您无法确定是否正在与您认为已连接的服务器通话 . 但是,如果您正在处理内部服务器并且获得"correct"证书不可行,请使用以下命令告知Web服务忽略证书问题并勇敢地参与其中 .

    前两个使用lambda表达式,第三个使用常规代码 . 第一个接受任何证书 . 最后两个至少检查证书中的主机名是否是您期望的主机名 .
    ...希望你觉得它很有帮助

    //Trust all certificates
    System.Net.ServicePointManager.ServerCertificateValidationCallback =
        ((sender, certificate, chain, sslPolicyErrors) => true);
    
    // trust sender
    System.Net.ServicePointManager.ServerCertificateValidationCallback
                    = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));
    
    // validate cert by calling a function
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
    
    // callback used to validate the certificate in an SSL conversation
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
    {
        bool result = false;
        if (cert.Subject.ToUpper().Contains("YourServerName"))
        {
            result = true;
        }
    
        return result;
    }
    
  • 18

    微软的SSL Diagnostics Tool可能有助于识别问题 .

    UPDATE 此链接现已修复 .

  • 338

    非常简单的“全部捕获”解决方案是这样的:

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

    sebastian-castaldi的解决方案更加详细 .

  • -4

    If not work bad sertificate, when ServerCertificateValidationCallback return true; 我的ServerCertificateValidationCallback代码:

    ServicePointManager.ServerCertificateValidationCallback += delegate
    {
        LogWriter.LogInfo("Проверка сертификата отключена, на уровне ServerCertificateValidationCallback");
        return true;
    };
    

    我阻止执行ServerCertificateValidationCallback的代码:

    if (!(ServicePointManager.CertificatePolicy is CertificateValidation))
        {
            CertificateValidation certValidate = new CertificateValidation();
            certValidate.ValidatingError += new CertificateValidation.ValidateCertificateEventHandler(this.OnValidateCertificateError);
            ServicePointManager.CertificatePolicy = certValidate;
        }
    

    OnValidateCertificateError函数:

    private void OnValidateCertificateError(object sender, CertificateValidationEventArgs e)
    {
        string msg = string.Format(Strings.OnValidateCertificateError, e.Request.RequestUri, e.Certificate.GetName(), e.Problem, new Win32Exception(e.Problem).Message);
        LogWriter.LogError(msg);
        //Message.ShowError(msg);
    }
    

    我禁用了CertificateValidation代码和ServerCertificateValidationCallback运行得非常好

  • 2

    我在使用url的网络服务器上运行此错误,例如:

    a.b.domain.com
    

    但它没有证书,所以我得到了一个名为的DNS

    a_b.domain.com
    

    只是在这里提示这个解决方案,因为这在谷歌中名列前茅 .

  • 153

    我个人最喜欢以下解决方案:

    using System.Security.Cryptography.X509Certificates;
    using System.Net.Security;
    

    ...然后在您请求获取错误之前,请执行以下操作

    System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
    

    咨询后发现这个Luke's Solution

相关问题