通过HTTPS使用web服务时引发System.Net.WebException

本文关键字:System Net WebException HTTPS 使用 web 服务 通过 | 更新日期: 2023-09-27 18:00:49

当使用HTTPS对服务器上运行的web服务进行调用时,我的应用程序引发System.Net.WebException,并显示消息"基础连接已关闭:无法与远程服务器建立信任关系"。我不知道如何绕过这个问题并成功地打电话。

通过HTTPS使用web服务时引发System.Net.WebException

经过一番研究,我发现了Jan Tielens的一篇博客文章,其中解释了正在发生的事情以及我的问题的解决方法:

当您浏览到HTTPS网站时,可能会看到一个对话框窗口,询问您是否希望信任Web服务器提供的证书。因此,接受证书的责任由用户承担。让我们回到Web服务场景,如果您想调用位于使用SSL和HTTPS的Web服务器上的Web服务,就会出现问题。当你从代码中进行调用时,不会弹出对话框,询问你是否信任证书(幸运的是,这在服务器端场景中会很难看(;可能会出现以下异常:

System.dll中发生类型为System.Net.WebException的未处理异常
附加信息:基础连接已关闭:无法与建立信任关系远程服务器。

但有一个解决方案问题,您可以在通过创建自己的代码CertificatePolicy类实现ICertificatePolicy接口(。在这门课上,你会必须自己写CheckValidationResult函数必须像您一样返回truefalse会在对话框中按"是"或"否"窗出于开发目的,我创建了以下类接受所有证书,因此您不会再获得讨厌的WebException

public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
    public TrustAllCertificatePolicy() { }
    public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
    {
        return true;
    }
}

正如你所看到的CheckValidationResult函数始终返回true,因此所有证书都将值得信赖。如果你想做这个上课更安全一点,你可以使用添加其他检查例如CCD_ 9参数。要使用此CertificatePolicy,您将必须告诉ServicePointManager使用它:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();

必须执行此操作(在应用程序生命周期(呼叫您的网络服务。

如果您使用的是自签名SSL证书或不受信任的SSL证书,您可以告诉应用程序忽略它(如果您真的想忽略它(。例如

ServicePointManager.ServerCertificateValidationCallback = _
      new RemoteCertificateValidationCallback(IgnoreSelfSSL)
public bool IgnoreSelfSSL(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) { 
   return true; 
}

在执行服务调用之前,您可以将回调放在将被命中的任何位置。

答案中给出的提示只能用于测试。对于验收/生产,您应该在调用WS的机器上安装WS证书,并在调用WS之前进行证书验证-过期、主题等。然后,您可以通过SoapHttpClientProtocol.Proxy.ClientCertificates.

将此证书添加到WS请求中