我有一个使用自签名证书在 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 测试客户端,我没有找到执行此操作的方法。
您可以在开发区创建一个非自签名证书,然后在 IIS 中使用该证书来应用 SSL。步骤是:
创建自签名证书
makecert -r -pe -n "CN=我的根权限" -a sha1 -sky 签名 -ss CA -sr 当前用户 -cy权威 -sv CA.pvk CA.cer
为 SSL 创建一个由该根证书签名的非自签名证书,然后从中创建 pfx 文件
makecert -pe -n "CN=服务器名称" -a sha1 -sky 交换 -eku 1.3.6.1.5.5.7.3.1 -ic CA.cer -iv CA.pvk -sp“Microsoft RSA SChannel 加密提供程序” -sy 12 -sv 服务器.pvk 服务器.cer pvk2pfx -pvk 服务器.pvk -spc 服务器.cer -pfx 服务器.pfx
现在您只需将
server.pfx
导入 IIS 并设置网站绑定即可使用此证书,并通过执行此 WCF 客户端将 CA.cer
\ Local Computer
存储中的 Trusted Root Certification Authorities
安装在服务器和客户端中可以通过 HTTPS 使用该服务,没有任何问题。
如果您将 WCF 测试客户端替换为 WCFStorm Lite Edition,您应该能够执行此操作。它是免费的,并且比 MS 的测试客户端灵活得多...例如,如果您正在进行用户名身份验证,它会让您指定用户名和密码。
回答您的问题...以下是如何强制 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;
}
是的,这是可能的。
只需从服务下载生成的 WSDL (https://localhost/Service1.svc?singleWsdl),并在 WCF 测试客户端中添加服务时提供此文件的路径。
您可以提供自己的方法来验证证书。
试试这个:
ServicePointManager.ServerCertificateValidationCallback +=
new System.Net.Security.RemoteCertificateValidationCallback(EasyCertCheck);
回电:
bool EasyCertCheck(object sender, X509Certificate cert,
X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
return true;
}