2008-09-20 130 views
80

我们正在设置一个新的SharePoint,但我们还没有有效的SSL证书。我想调用其上的列表web服务来检索一些有关设置的元数据。然而,当我尝试这样做,我得到异常:在.Net中调用Web服务时绕过无效的SSL证书错误

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

嵌套异常包含错误信息:

The remote certificate is invalid according to the validation procedure.

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

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

回答

17

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

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

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

+0

这也是我的第一个想法。不幸的是,证书也过期了,所以它不可能被信任。 – 2008-09-20 20:54:54

+0

是否有任何理由不能使用像CA cert这样的人?如果它是一个测试证书,那么你可以继续。 我不确定是否有办法将这些检查关闭! – 2008-09-20 20:57:14

107

或者,你可以打电话登记回委托其忽略认证错误:

... 
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler; 
... 

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error) 
{ 
// Ignore errors 
return true; 
} 
+1

我将此静态方法添加到global.asax并在“OnApplicationStart”上设置事件。像魅力一样工作。谢谢 – 2013-11-01 17:01:02

71

像贾森小号的回答是:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

我把这个在我的主,看看我的app.config和测试如果(ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")在调用该行代码之前。

20

我解决这样说:

调用以下之前调用您的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; 
     }; 
} 
0

对于新手, 你可以在一个单独的CS扩展您的部分服务类文件并添加代码“imanabidi”提供的代码以使其集成在一起

10

我在使用DownloadString时遇到了同样的错误;并能够使得它的工作原理,如下面的建议本页面

System.Net.WebClient client = new System.Net.WebClient();    
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
string sHttpResonse = client.DownloadString(sUrl); 
2
ServicePointManager.ServerCertificateValidationCallback += 
      (mender, certificate, chain, sslPolicyErrors) => true; 

上会绕过invaild SSL。将其写入您的Web服务构造函数。

1

为了进一步扩展Simon Johnsons的文章 - 理想情况下,你需要一个能够模拟你在生产中看到的条件的解决方案,并且修改你的代码不会这么做,并且如果你忘记在你之前忘记代码,部署它。

您需要某种自签名证书。如果您使用的是IIS Express,则您将拥有其中一个,您只需要找到它即可。打开Firefox或任何你喜欢的浏览器并进入你的开发网站。您应该能够从URL栏中查看证书信息,并且根据您的浏览器,您应该能够将证书导出到文件。

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

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