如何在 WCF 客户端中接受自签名 SSL 证书?

Posted

技术标签:

【中文标题】如何在 WCF 客户端中接受自签名 SSL 证书?【英文标题】:How to accept a self-signed SSL certificate in a WCF client? 【发布时间】:2011-06-26 00:30:20 【问题描述】:

这可能是一个愚蠢的问题,但我就是找不到答案。

我想做的事: 我有一个由 IIS 托管的 WCF 服务。它运行良好,我可以访问 wsdl,我有服务器的自签名证书等。我想从 WPF 客户端调用此服务。

问题是,由于我有自签名证书,调用服务时出现以下异常: 无法为具有权限“localhost”的 SSL/TLS 安全通道建立信任关系。

如果我从浏览器访问站点(或服务),那没问题,因为浏览器会警告我有关证书的信息,并让我选择查看页面。但是 WPF 客户端只是抛出一个异常。

我不想完全关闭身份验证过程,我只是想让用户选择忽略此警告(就像浏览器一样)。

谁能为此提供一些代码?如果你遇到了一个很好的、详细的教程,那也太棒了。 (看,我发现的教程的问题是缺乏细节)

【问题讨论】:

我更改了问题以反映自签名证书不属于默认受信任根证书的问题。 【参考方案1】:

这是使 WCF 客户端接受任意证书所需的最少代码量。这是不安全。仅用于测试。如果这段代码发疯并吃掉你的小猫,请不要怪我。

ServicePointManager.ServerCertificateValidationCallback +=
            new System.Net.Security.RemoteCertificateValidationCallback(EasyCertCheck);

回调:

bool EasyCertCheck(object sender, X509Certificate cert,
        X509Chain chain, System.Net.Security.SslPolicyErrors error)

    return true;

代码无耻地从Is it possible to force the WCF test client to accept a self-signed certificate?的最没有帮助的答案中提取

【讨论】:

完美使用语言:)【参考方案2】:

您可以自己注册证书。如果在客户端也加载证书,然后将其注册为受信任,则不应收到该警告。

您需要找到 X509CertificateCollection 并将证书添加到该集合中。我在 Ssl 上运行的 SmtpClient 遇到了这种问题。

通过挂钩System.Net.ServicePointManager.ServerCertificateValidationCallback 或实现System.Net.ICertificatePolicy 并将我自己安装的证书标识为有效/受信任(附加到System.Net.ServicePointManager.CertificatePolicy)。

这本身不是 WCF 的东西,但据我所知,这也应该转化为 WCF。这完全取决于 WCF 在后台使用什么。

【讨论】:

你能指定在哪里写这些东西吗?什么类应该实现接口等?我对 WCF 的这一方完全陌生,我从未使用过安全连接或 IIS,所以我还是有点迷茫...... 如果你钩住System.Net.ServicePointManager.ServerCertificateValidationCallback,你会收到验证证书的请求吗? 对此的非代码方法是信任您的开发机器和测试环境上的证书。如此处所述***.com/a/11296429/178620

以上是关于如何在 WCF 客户端中接受自签名 SSL 证书?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 客户端中接受服务器的自签名 ssl 证书

WCF 自签名证书在客户端上不受信任

出于开发目的,如何使用 iOS 7 的 NSURLSession 及其委托方法系列接受自签名 SSL 证书?

如何使用 iOS 7 的 NSURLSession 接受自签名 SSL 证书

如何让 WCF 服务在 SSL 上运行?

Mac OS X - 接受自签名多域 SSL 证书