我正在尝试了解基于证书的传输安全身份验证过程。假设我正在制作一个服务,并在8732端口上打开https,配置如下:
<wsHttpBinding>
<binding name="SecurityTest">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
<service name="MyNamespace.MyService">
<host>
<baseAddresses>
<add baseAddress="https://localhost:8732/MyService/" />
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding" bindingConfiguration="SecurityTest"
contract="MyNamespace.IContract" >
</endpoint>
</service>
然后我为根颁发机构创建了一个自签名证书,这样我就可以创建新的证书:
makecert -n "CN=MyAuthority" -r -sv MyAuthority.pvk MyAuthority.cer -sky exchange
然后我将我的MyAuthority.cer
添加到本地机器"根"目录中。之后,我使用我的MyAuthority证书创建了另一个证书,并将其放在本地机器的"我的"目录中:
makecert -sky exchange -sk local -iv MyAuthority.pvk -n "CN=local" -ic MyAuthority.cer local.cer -sr Localmachine -ss My
然后我使用netsh将我的local.cer证书绑定到8732端口:
netsh http add sslcert ipport=0.0.0.0:8732 certhash=02b751d7f71423c27141c9c385fc3d3976 d7 aa b5 appid={C4BFC5DC-2636-495B-9803-8DD8257C92C3}
服务器服务端已经完成,它开始工作。现在我创建了一个客户端:
<bindings>
<wsHttpBinding>
<binding name="SecurityTest" >
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint name="testPoint"
address="https://localhost:8732/MyService/"
binding="wsHttpBinding" bindingConfiguration="SecurityTest"
behaviorConfiguration="ep"
contract="MyNamespace.IContract">
</endpoint>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="ep" >
<clientCredentials>
<clientCertificate findValue="local"
storeLocation="CurrentUser" storeName="My"
x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
当我启动它并使用服务方法时,我得到一个错误:
MessageSecurityException:从远程计算机访问凭据安全WCF服务时,客户端身份验证方案"匿名"禁止HTTP请求
如果我很好地理解这个方案中的所有内容,我该问什么,也许可以得到建议,如何解决这个错误。
我的服务是否使用local.cer在传输级别加密消息?
我是否必须将
MyAuthority.cer
添加到每个客户端计算机上的Trusted已发布目录中,以便我的客户端可以在不创建个人验证处理程序的情况下解密消息?在当前示例中,我的客户端是否使用local.cer作为凭据,并且该证书将被发送到服务端?
服务器端如何处理客户端证书?它是检查它是否由MyAuthority.cer签名,还是使用ssl证书进行检查?如何查看证书是用什么进行检查的?
为什么会出现错误?
提前感谢
1)。我的服务是否使用local.cer在传输级别加密消息
是的,确实如此。
2)。我是否必须将MyAuthority.cer添加到每个客户端计算机上的Trusted发布目录中,以便我的客户端可以在不创建个人验证处理程序的情况下解密消息
是的,因为您使用的是自签名证书(由您创建的授权机构/CA签名),所以客户端需要信任授权机构/CA,或者您需要在客户端为"异常"编写代码/配置。
3)。在当前示例中,我的客户端是否使用local.cer作为凭据,并且该证书将被发送到服务端
这可能没问题,但您不应该对客户端和服务器都使用相同的证书——您应该对客户端使用不同的证书。目前,根据您的配置,您正在指示它使用以下证书:
<clientCertificate findValue="localhost" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
因此,如果您的CurrentUser/My存储中有一个主题名称为"localhost"的证书,并且运行客户端程序的身份可以访问它(及其私钥),那么它将作为客户端证书提供给服务器。
4)。服务器端如何处理客户端证书?它是检查它是否由MyAuthority.cer签名,还是使用ssl证书进行检查?如何查看证书是用什么进行检查的
服务器端的框架检查提供的客户端证书是否有效和可信,仅此而已。如果客户出示由例如VeriSign签署的证书,并且您的机器/受信任的CA存储中有VeriSign CA,则该证书将被视为有效的客户证书。如果要将接受的证书限制为仅由特定CA签名的证书,则需要为此添加其他代码(或从存储中删除所有其他受信任的CA)。
5)。为什么会出现错误
您可以看到这个(相当神秘的)错误消息有几个原因。首先,你的商店里有符合第3项规定的证书吗?