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