当使用HTTPS调用在服务器上运行的Web服务时,我的应用程序抛出System.Net.WebException,并显示消息“底层连接已关闭:无法与远程服务器建立信任关系”。我不知道如何解决这个问题并成功拨打电话。
答案 0 :(得分:17)
经过一番研究后,我找到了Jan Tielens的博客文章,其中解释了正在发生的事情并解决了我的问题:
当您浏览到HTTPS站点时,您可能会看到一个对话窗口,询问您是否要信任Web服务器提供的证书。因此,接受证书的责任由用户处理。让我们回到webservice场景,如果你想调用位于使用SSL和HTTPS的web服务器上的web服务,就会出现问题。当您从代码进行调用时,没有弹出对话框窗口,并询问您是否信任该证书(幸运的是,因为这在服务器端场景中非常难看);可能你会得到以下异常:
System.dll 中发生了
System.Net.WebException
类型的未处理异常 附加信息:基础 连接已关闭:无法 建立信任关系 远程服务器。但是有一个解决方案 问题,你可以解决这个问题 通过创建自己的代码
CertificatePolicy
类(其中 实现ICertificatePolicy
接口)。在这堂课你会 必须自己写CheckValidationResult
的功能 必须像您一样返回true
或false
会在对话框中按是或否 窗口。出于开发目的,我已经 创建了以下类 接受所有证书,所以你不会 再次讨厌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请求。