是否可以强制 WCF 测试客户端接受自签名证书?
Posted
技术标签:
【中文标题】是否可以强制 WCF 测试客户端接受自签名证书?【英文标题】:Is it possible to force the WCF test client to accept a self-signed certificate? 【发布时间】:2011-02-17 01:32:37 【问题描述】:我有一个使用自签名证书在 IIS 7 中运行的 WCF Web 服务(这是一个概念证明,以确保这是我想要走的路线)。必须使用 SSL。
是否可以使用 WCF 测试客户端来调试此服务而无需非自签名证书?
当我尝试时,我得到了这个错误:
错误:无法从 https:///Service1.svc 如果这是 Windows (R) 通信 您拥有的基金会服务 访问,请检查您是否拥有 启用元数据发布 指定的地址。寻求帮助 元数据发布,请参考 MSDN 文档位于 http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata 交换错误 URI: https:///Service1.svc 元数据包含一个引用 无法解决: 'https:///Service1.svc'。 无法建立信任关系 对于 SSL/TLS 安全通道 权威 ''。这 底层连接已关闭: 无法建立信任关系 用于 SSL/TLS 安全通道。这 远程证书无效 根据验证 procedure.HTTP GET 错误 URI: https:///Service1.svc 下载时出错 'https:///Service1.svc'。 底层连接已关闭: 无法建立信任关系 用于 SSL/TLS 安全通道。这 远程证书无效 根据验证程序。
编辑:这个问题专门关于使用 WCF 测试客户端 来测试已经使用自签名证书通过 SSL 保护的 Web 服务。服务器已经设置为接受提供的任何证书,它是 WCF 测试客户端,我看不到这样做的方法。
【问题讨论】:
【参考方案1】:您可以在开发区创建一个非自签名证书,然后在 IIS 中使用此证书来应用 SSL。步骤是:
创建自签名证书
makecert -r -pe -n "CN=My Root Authority" -a sha1 -sky 签名 -ss CA -sr 当前用户 -cy 权限 -sv CA.pvk CA.cer
为 SSL 创建一个由该根证书签名的非自签名证书,然后从中创建 pfx 文件
makecert -pe -n "CN=servername" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic CA.cer -iv CA.pvk -sp "Microsoft RSA SChannel 加密提供程序" -sy 12 -sv server.pvk server.cer pvk2pfx -pvk server.pvk -spc server.cer -pfx server.pfx
现在您只需将 server.pfx
导入 IIS 并设置网站绑定以使用此证书,并将 CA.cer
安装在 Local Computer
\ Trusted Root Certification Authorities
存储在服务器和客户端中WCF 客户端将通过 HTTPS 与服务一起工作,没有任何问题。
【讨论】:
美女!另一个技巧是您可能会收到无效密码错误,您可以通过在最后一行的命令行上传递密码来解决该错误: pvk2pfx -pvk server.pvk -pi "yourpw" -spc server.cer -pfx server.pfx -po “你的” 在服务器上添加 pfx 时出现密码不正确的错误,但我只是跳过输入密码,一切似乎都正常。【参考方案2】:如果您将 WCF 测试客户端替换为 WCFStorm Lite Edition,您应该能够做到这一点。它是免费的,并且比 MS 的测试客户端更灵活...例如,如果您进行用户名身份验证,它会让您指定用户名和密码。
【讨论】:
如果你和我一样,不喜欢下载你从未听说过的软件,这里是 Visual Studio 杂志对 WFCStorm 的评论。 visualstudiomagazine.com/articles/2012/10/29/…【参考方案3】:this question 的回答对我有帮助。请务必使用 exact 机器名称作为证书预期。例如,machine/service.svc
可能不起作用,而 machine.domain/service.svc
- 起作用。
【讨论】:
我的是另一种方式(如 machine.domain 失败,而机器刚刚工作)。谢谢!【参考方案4】:回答您的问题...这是强制 WCF 测试客户端接受自签名证书的方法...
using (ServiceReference1.Service1Client proxy = new ServiceReference1.Service1Client())
System.Net.Security.RemoteCertificateValidationCallback callBack = (sender, certificate, chain, sslPolicyErrors) => true;
ServicePointManager.ServerCertificateValidationCallback += callBack;
Console.WriteLine(proxy.GetData(35));
ServicePointManager.ServerCertificateValidationCallback -= callBack;
【讨论】:
我认为他的意思是 WCFTestClient.exe。不管怎样,您的回答对我的 WCF 测试客户端 Project 有所帮助。【参考方案5】:是的,这是可能的。
只需从服务 (https://localhost/Service1.svc?singleWsdl) 下载生成的 WSDL,并在 WCF 测试客户端中添加服务时提供此文件的路径。
【讨论】:
【参考方案6】:您可以提供自己的方法来验证证书。
试试这个:
ServicePointManager.ServerCertificateValidationCallback +=
new System.Net.Security.RemoteCertificateValidationCallback(EasyCertCheck);
回调:
bool EasyCertCheck(object sender, X509Certificate cert,
X509Chain chain, System.Net.Security.SslPolicyErrors error)
return true;
【讨论】:
我看不到任何方法可以将此代码添加到 WCF 测试客户端(我无法控制的代码)。我已经将此调用添加到我自己的代码中(服务器端)。 当然,如果您试图强制任何其他 C# WCF 客户端接受自签名安全证书,这正是正确的方法。以上是关于是否可以强制 WCF 测试客户端接受自签名证书?的主要内容,如果未能解决你的问题,请参考以下文章
Tomcat 服务器和 HTTP 客户端接受过期的自签名证书