我有一个自托管服务,我想添加传输安全性。 我已将WSHttpBinding.SecurityMode设置为Transport,将ClientCredentialType设置为HttpClientCredentialType.None。 我已经创建了一个证书并将其设置为我的主机 ServiceHost.Credentials.ServiceCertificate.SetCertificate() 我也用它注册了 netsh http add sslcert ipport = 127.0.0.1:80 certhash = [MyCertHash] certstorename = MY appid = [TheGuidOfTheAppTahtRunsTheService] verifyclientcertrevocation = disable
每当我尝试调用该服务时,都会收到以下错误消息: “身份验证失败,因为远程方已关闭传输流。”
这是否意味着客户端和服务器尝试相互验证?我该如何禁用它? 为了清楚起见,我不想在客户端安装证书,我不是在寻找任何身份验证atm,只是保护消息内容,如果可能的话。
答案 0 :(得分:2)
此MSDN post可能有助于解决您的问题。帖子中的初始请求是配置与您不同的安全模式,但是它们会切换到传输模式进行故障排除,并且该信息应该适用于您的情况。
如果您所描述的是安装证书所做的全部工作,那么您将错过几个步骤。该帖子概述了安装有效证书的过程。祝你好运!!
答案 1 :(得分:2)
证书在某些时候可能会让人感到痛苦。你应该总是对WCF做的第一件事就是启用跟踪:
http://msdn.microsoft.com/en-us/library/ms733025.aspx
然后,您可以使用SVCTraceViewer查看服务在幕后生成的异常,并深入了解正在发生的事情,这是许多WCF问题的必要条件。在10次中有9次,跟踪将告诉您需要知道的一切。
此外,请确保客户端和服务器都配置了证书,因为需要在两台计算机上安装证书。
答案 2 :(得分:2)
我试图追踪同样的错误,并发现了这篇文章。 WCF跟踪没有帮助,因为错误出现在HTTP堆栈的客户端,而在服务器端,请求在它进入WCF层之前被拒绝。
我发现我不够透彻。确保满足以下所有条件。我有一些但并非所有这些正确设置:
服务器的证书颁发者具有有效且匹配的签发 在同一台计算机上受信任的根CA.
服务器证书使用者名称与计算机名称匹配
确切地说,客户端访问的机器名也匹配(“localhost”与服务器的Environment.MachineName
值)
服务器证书的指纹
已由管理员设置
使用以下命令(使用
netsh
相当于较新版本的Windows)
httpcfg set ssl -i 0.0.0.0:{port} -h {thumbprint}
此客户端在客户端计算机上也具有相同的有效颁发根CA证书。
这是一个很好的参考:SSL with Self-hosted WCF Service。