【发布时间】:2011-09-27 00:17:38
【问题描述】:
当使用 HTTPS 调用在服务器上运行的 Web 服务时,我的应用程序抛出 System.Net.WebException 并显示消息“底层连接已关闭:无法与远程服务器建立信任关系”。我不确定如何解决此问题并成功拨打电话。
【问题讨论】:
-
可以通过浏览器访问网址吗?如果是,浏览器是否会警告您证书无效?
标签: c# web-services ssl https
当使用 HTTPS 调用在服务器上运行的 Web 服务时,我的应用程序抛出 System.Net.WebException 并显示消息“底层连接已关闭:无法与远程服务器建立信任关系”。我不确定如何解决此问题并成功拨打电话。
【问题讨论】:
标签: c# web-services ssl https
经过一番研究,我发现了 Jan Tielens 的一篇博客文章,其中解释了发生的事情以及解决我的问题的方法:
当您浏览 HTTPS 站点时,您可能会看到一个对话窗口,询问您是否要信任网络服务器提供的证书。因此接受证书的责任由用户承担。让我们回到 Web 服务场景,如果您想调用位于使用 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();
必须这样做(在 应用程序生命周期)在制作之前 对您的网络服务的调用。
【讨论】:
如果您使用的是自签名 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 请求中。
【讨论】: