在调用 .Net 中的 Web 服务时,如何绕过无效的 SSL 证书错误

91
我们正在建立一个新的SharePoint网站,但是我们还没有有效的SSL证书。我想调用其上的Lists Web服务以检索有关设置的某些元数据。但是当我尝试这样做时,我会收到以下异常信息:

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

嵌套的异常包含以下错误消息:

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

这是正确的,因为我们使用的是临时证书。
我的问题是:如何告诉.NET Web服务客户端(SoapHttpClientProtocol)忽略这些错误?
8个回答

115

或者你可以注册一个回调委托来忽略证书错误:

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

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

1
我在global.asax中添加了这个静态方法,并在"OnApplicationStart"事件上设置了该方法。效果非常好。谢谢。 - Juan Zamora
1
@JuanZamora 我做了和你一样的事情。它起作用了! - Sachin B. R.
5
如果你想容易受到"中间人攻击",那么以下就是你需要做的。 - Houtman
2
理想情况下,您应该只在开发环境中执行此操作。 - Ron DeFreitas

81

和Jason S的答案类似:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

我将这个代码段放进了我的Main函数中,并查看了我的app.config文件,测试了(ConfigurationManager.AppSettings["IgnoreSSLCertificates"]=="True")是否为真,然后再执行这一行代码。


26

我是这样解决的:

在调用会导致此错误的 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;
        };
}

18

当面对此问题时,我采用的方法是将临时证书签署者添加到相关计算机的信任授权列表中。

我通常使用由CACERT创建的证书进行测试,将证书添加到我的信任授权列表中效果很好。

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


这也是我的第一个想法。不幸的是,证书也已过期,因此无法获得信任。 - jan.vdbergh
你有没有使用类似CA证书的人的原因?如果这是一个测试证书,那么你可以直接使用它。我不确定是否有办法关闭这些检查! - Simon Johnson

12

我使用DownloadString时遇到了相同的错误,并能够按照这个页面的建议进行以下更改,使其正常工作。

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

3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

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


1
对于新手,您可以在单独的cs文件中扩展您的部分类,并添加由“imanabidi”提供的代码以进行集成。

1
进一步阐述Simon Johnson的帖子 - 理想情况下,您需要一个可以模拟生产环境条件的解决方案,修改您的代码不会做到这一点,如果您在部署之前忘记删除代码可能会很危险。
您将需要某种自签名证书。如果您使用IIS Express,则已经有其中之一,您只需找到它即可。打开Firefox或其他浏览器并转到您的开发网站。您应该能够从URL栏中查看证书信息,并且根据您的浏览器,您应该能够将证书导出到文件中。
接下来,打开MMC.exe,并添加证书控件。将您的证书文件导入Trusted Root Certificate Authorities存储库中,这就是您所需要的全部内容。重要的是要确保它进入该存储库而不是其他存储库,例如“个人”。如果您不熟悉MMC或证书,则有许多网站提供如何执行此操作的信息。
现在,您的计算机作为整体将隐式信任其自己生成的任何证书,并且您不需要添加处理此特殊情况的代码。当您转移到生产环境时,只要安装了适当的有效证书,它将继续工作。不要在生产服务器上执行此操作 - 这将是不好的,并且它将无法为除服务器本身之外的任何其他客户端工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接