【发布时间】:2014-04-20 00:34:01
【问题描述】:
我正在尝试在 自托管 WCF 服务和客户端应用程序之间设置 Mutual SSL 演示(现在是命令提示符)。最后,我试图找到一个解决方案,在该解决方案中,我在使用证书进行传入连接的服务器和多个客户端之间具有传输安全性(不是消息安全性),每个客户端都有我可以使用的单独证书用于唯一标识每个客户端。
我已经尝试了许多不同的方法,但都没有奏效(我无法找到我一直在尝试做的事情的确切示例)。每次我认为我已经接近时,当我尝试调用服务时,我最终都会在客户端出现异常。我遇到的最常见的异常是:
“The HTTP request was forbidden with client authentication scheme 'Anonymous'.”
Inner exception: "The remote server returned an error: (403) Forbidden."
是否有人对我可能做错了什么有任何想法,或者可能更好地了解如何在上述场景中设置相互 SSL?
完全披露-截至目前,我在同一台计算机上同时运行客户端和服务器。不确定这是否重要。
在下面配置sn-ps
服务和客户端代码相对简单,所以我非常有信心让它们正常工作。应用配置(特别是绑定和行为)和证书“更有趣”,所以我对此没有那么自信。
我如何创建证书(逐字逐句的实际命令)
makecert -pe -n "CN=SelfSignedCA" -ss Root -sr LocalMachine -a sha1 -sky signature -r -sv "SelfSignedCA.cer" "SelfSignedCA.pvk"
makecert -pe -n "CN=system" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in "SelfSignedCA" -is Root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 Service.cer
makecert -pe -n "CN=client1" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in "SelfSignedCA" -is Root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 Client1.cer
将证书与端口关联(实际命令逐字)
netsh http add urlacl url=https://+:44355/MyService/ user=EVERYONE
服务器设置
绑定:
<wsHttpBinding>
<binding name="CustomBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
行为:
<serviceBehaviors>
<behavior name="">
<!--
<serviceCredentials>
<serviceCertificate
findValue="system"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName"/>
</serviceCredentials>
-->
<serviceAuthorization
serviceAuthorizationManagerType=
"ClientAuthorization.ClientCertificateAuthorizationManager, Simulator.Service.SideA" />
</behavior>
</serviceBehaviors>
客户
绑定:
<wsHttpBinding>
<binding name="CustomBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
行为
<endpointBehaviors>
<behavior name="ChannelManagerBehavior">
<clientCredentials>
<clientCertificate findValue="client1"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
<!--
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust"/>
</serviceCertificate>
-->
</clientCredentials>
</behavior>
</endpointBehaviors>
更新
所以我向服务器添加了一个自定义用户名和密码验证器,试图覆盖默认行为并始终允许,无论提供的凭据如何(再次,我真的不想要用户名/密码验证)。 此验证器永远不会被调用。 客户端仍会获得“身份验证方案‘匿名’。”例外。
服务行为更新
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType=
"Service.ClientAuthorization.ClientUserNamePasswordValidatorManager, Service.SideA" />
</serviceCredentials>
【问题讨论】:
标签: wcf ssl https mutual-authentication