【问题标题】:System.Net.WebException thrown when consuming a web service over HTTPS通过 HTTPS 使用 Web 服务时引发 System.Net.WebException
【发布时间】:2011-09-27 00:17:38
【问题描述】:

当使用 HTTPS 调用在服务器上运行的 Web 服务时,我的应用程序抛出 System.Net.WebException 并显示消息“底层连接已关闭:无法与远程服务器建立信任关系”。我不确定如何解决此问题并成功拨打电话。

【问题讨论】:

  • 可以通过浏览器访问网址吗?如果是,浏览器是否会警告您证书无效?

标签: c# web-services ssl https


【解决方案1】:

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

当您浏览 HTTPS 站点时,您可能会看到一个对话窗口,询问您是否要信任网络服务器提供的证书。因此接受证书的责任由用户承担。让我们回到 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,因此所有证书都将 值得信赖。如果你想做这个 上课更安全一点,你 可以使用 X509Certificate 参数例如。 要使用此CertificatePolicy,您将 必须告诉ServicePointManager 使用它:

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

必须这样做(在 应用程序生命周期)在制作之前 对您的网络服务的调用。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 2018-03-31
        • 1970-01-01
        • 2012-03-22
        相关资源
        最近更新 更多