如何在 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 证书?的主要内容,如果未能解决你的问题,请参考以下文章
出于开发目的,如何使用 iOS 7 的 NSURLSession 及其委托方法系列接受自签名 SSL 证书?