通过HTTPS使用Web服务时抛出System.Net.WebException

时间:2011-07-01 19:49:09

标签: c# web-services ssl https

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

3 个答案:

答案 0 :(得分:17)

经过一番研究后,我找到了Jan Tielens的博客文章,其中解释了正在发生的事情并解决了我的问题:

  

当您浏览到HTTPS站点时,您可能会看到一个对话窗口,询问您是否要信任Web服务器提供的证书。因此,接受证书的责任由用户处理。让我们回到webservice场景,如果你想调用位于使用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();
  

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

答案 1 :(得分:3)

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

ServicePointManager.ServerCertificateValidationCallback = _
      new RemoteCertificateValidationCallback(IgnoreSelfSSL)

public bool IgnoreSelfSSL(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) { 
   return true; 
}

您可以在执行服务呼叫之前将回调放置在任何位置。

答案 2 :(得分:1)

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