ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

嵌套异常包含错误消息:

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

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

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


A
Alex Bagnolini

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

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

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

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

就像 Jason S 的回答一样:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

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


U
Uwe Keim

我是这样解决的:

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

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

S
Simon Johnson

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

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

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


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

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

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

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

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


S
Senthil

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


N
Nigel Thomas

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

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

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

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅