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


87

我们正在设置一个新的SharePoint,但我们还没有有效的SSL证书。我想在其上调用Lists Web服务以检索有关该设置的一些元数据。但是,当我尝试执行此操作时,出现异常:

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

嵌套异常包含错误消息:

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

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

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

Answers:


18

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

我通常会使用CACERT创建的证书进行测试,并将其添加到我信任的授权机构列表中的过程非常顺利。

以这种方式进行操作意味着您不必在应用程序中添加任何自定义代码,并且可以正确模拟部署应用程序时的情况。因此,我认为这是以编程方式关闭检查的绝佳解决方案。


那也是我的第一个想法。不幸的是,证书也已过期,因此不可能使它受信任。
jan.vdbergh's

有什么理由不能使用CA证书等人?如果是测试证书,那么您可以继续进行。我不确定是否有办法关闭这些检查!
西蒙·约翰逊

113

或者,您可以注册一个忽略认证错误的回叫代表:

...
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 BR 2015年

5
如果您想对“中间人”攻击不敏感,这就是您需要做的...
Houtman

2
理想情况下,您只应在开发环境中执行此操作。
罗恩·德弗雷塔斯

79

就像Jason S的答案一样:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

我将其放在Main中,app.config(ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")在调用该代码行之前查看并测试是否。


24

我是这样解决的:

在调用导致该错误的ssl网络服务之前,请调用以下命令:

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;
        };
}

11

使用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 Johnsons的职位-理想情况下,您需要一个解决方案来模拟您将在生产中看到的条件,并且修改代码不会这样做,并且如果您忘记在部署之前删除代码,可能会很危险。

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

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

现在,您的计算机作为一个整体将隐式信任它自己生成的所有证书,并且您无需添加代码来专门处理此证书。当您进入生产环境时,只要您在那里安装了正确的有效证书,它将继续工作。不要在生产服务器上执行此操作-这很不好,除了服务器本身上的客户端以外,其他客户端都无法使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.