【问题标题】:Bypass invalid SSL certificate errors when calling web services in .Net在 .Net 中调用 Web 服务时绕过无效的 SSL 证书错误
【发布时间】:2008-09-20 20:07:16
【问题描述】:

我们正在设置一个新的 SharePoint,我们还没有有效的 SSL 证书。我想在其上调用 Lists Web 服务来检索有关设置的一些元数据。但是,当我尝试这样做时,我得到了异常:

底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。

嵌套异常包含错误信息:

根据验证程序,远程证书无效。

这是正确的,因为我们使用的是临时证书。

我的问题是:如何告诉 .Net Web 服务客户端 (SoapHttpClientProtocol) 忽略这些错误?

【问题讨论】:

    标签: .net web-services sharepoint


    【解决方案1】:

    或者,您可以注册一个忽略认证错误的回调委托:

    ...
    ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
    ...
    
    static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
    {
    // Ignore errors
    return true;
    }
    

    【讨论】:

    • 我将此静态方法添加到 global.asax 并在“OnApplicationStart”上设置事件。像魅力一样工作。谢谢
    • @JuanZamora 我做了和你一样的事。成功了!
    • 这就是你需要做的所有事情,如果你想容易受到“中间人”的攻击...
    • 理想情况下,您应该只在开发环境中执行此操作。
    【解决方案2】:

    就像 Jason S 的回答:

    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    

    我把它放在我的 Main 中,并在调用那行代码之前查看我的 app.config 并测试 (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")

    【讨论】:

      【解决方案3】:

      我是这样解决的:

      在调用导致该错误的 ssl web 服务之前调用以下命令:

      using System.Net;
      using System.Net.Security;
      using System.Security.Cryptography.X509Certificates;
      
      /// <summary>
      /// solution for exception
      /// System.Net.WebException: 
      /// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
      /// </summary>
      public static void BypassCertificateError()
      {
          ServicePointManager.ServerCertificateValidationCallback +=
      
              delegate(
                  Object sender1,
                  X509Certificate certificate,
                  X509Chain chain,
                  SslPolicyErrors sslPolicyErrors)
              {
                  return true;
              };
      }
      

      【讨论】:

        【解决方案4】:

        我在遇到此问题时使用的方法是将临时证书的签名者添加到相关计算机上的受信任机构列表中。

        我通常使用使用 CACERT 创建的证书进行测试,并将它们添加到我的受信任机构列表中效果很好。

        这样做意味着您不必向应用程序添加任何自定义代码,并且它可以正确模拟部署应用程序时会发生的情况。因此,我认为这是以编程方式关闭检查的绝佳解决方案。

        【讨论】:

        • 这也是我的第一个想法。不幸的是,证书也已过期,因此无法信任它。
        • 有什么理由不能使用像 CA 证书这样的人吗?如果它是测试证书,那么您可以继续进行。我不确定是否有办法关闭这些检查!
        【解决方案5】:

        我在使用 DownloadString 时遇到了同样的错误;并能够通过此页面上的建议使其如下工作

        System.Net.WebClient client = new System.Net.WebClient();            
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
        string sHttpResonse = client.DownloadString(sUrl);
        

        【讨论】:

          【解决方案6】:
          ServicePointManager.ServerCertificateValidationCallback +=
                      (mender, certificate, chain, sslPolicyErrors) => true;
          

          将绕过无效的 ssl 。将其写入您的 Web 服务构造函数。

          【讨论】:

            【解决方案7】:

            对于新手来说, 您可以在单独的 cs 文件中扩展您的部分服务类,并添加“imanabidi”提供的代码以使其集成

            【讨论】:

              【解决方案8】:

              进一步扩展 Simon Johnson 的帖子 - 理想情况下,您需要一个能够模拟您将在生产中看到的条件的解决方案,并且修改您的代码不会这样做,并且如果您在部署之前忘记取出代码可能会很危险它。

              您将需要某种自签名证书。如果您使用的是 IIS Express,那么您已经拥有其中之一,您只需找到它。打开 Firefox 或任何您喜欢的浏览器,然后访问您的开发网站。您应该能够从 URL 栏中查看证书信息,并且根据您的浏览器,您应该能够将证书导出到文件中。

              接下来,打开 MMC.exe,然后添加证书管理单元。将您的证书文件导入受信任的根证书颁发机构存储,这就是您所需要的。重要的是要确保它进入那家商店,而不是像“个人”这样的其他商店。如果您不熟悉 MMC 或证书,有许多网站提供有关如何执行此操作的信息。

              现在,您的计算机作为一个整体将隐式信任它自己生成的任何证书,您无需添加代码来专门处理此问题。当您转移到生产环境时,只要您在那里安装了适当的有效证书,它将继续工作。不要在生产服务器上执行此操作 - 这会很糟糕,并且它不适用于服务器本身以外的任何其他客户端。

              【讨论】:

                猜你喜欢
                • 2010-12-07
                • 2016-11-03
                • 1970-01-01
                • 1970-01-01
                • 2019-01-05
                • 2014-11-01
                • 2014-04-10
                相关资源
                最近更新 更多