是否可以强制 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 测试客户端接受自签名证书?的主要内容,如果未能解决你的问题,请参考以下文章

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

Tomcat 服务器和 HTTP 客户端接受过期的自签名证书

创建用于测试 localhost 的自签名证书并使其被浏览器接受

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

如何以编程方式为 WCF 服务创建自签名证书?

App Store 是不是接受自签名证书应用程序?