我试图了解基于证书的传输安全身份验证过程。假设我正在使用以下配置创建服务,并在 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
到每台客户端计算机上的受信任的已发布目录,以便我的客户端可以在不创建个人验证处理程序的情况下解密消息?当前示例中的我的客户是否使用 local.cer 作为他的凭据,并且此证书将发送到服务端?
服务器端如何处理客户端证书?它是否检查它是由 MyAuthority.cer 签名还是使用 ssl 证书检查它?如何查看证书的检查内容?
为什么我会收到错误消息?
提前致谢