如何将WCF服务配置为仅接受由x509证书标识的单个客户端
我有一个WCF客户端/服务应用程序,它依赖于两台机器之间的安全通信,我想使用证书存储中安装的x509证书来相互识别服务器和客户端。为此,我将绑定配置为如何将WCF服务配置为仅接受由x509证书标识的单个客户端,wcf,web-services,security,ws-security,x509certificate,Wcf,Web Services,Security,Ws Security,X509certificate,我有一个WCF客户端/服务应用程序,它依赖于两台机器之间的安全通信,我想使用证书存储中安装的x509证书来相互识别服务器和客户端。为此,我将绑定配置为。只有客户端计算机 服务器在本地计算机/个人存储中安装了颁发给server.mydomain.com的证书,客户端在同一位置安装了颁发给client.mydomain.com的证书。除此之外,服务器在本地计算机/受信任人员中拥有客户端的公共证书,客户端在本地计算机/受信任人员中拥有服务器的公共证书 最后,客户端被配置为检查服务器的证书。我使用配置文
。只有客户端计算机
服务器在本地计算机/个人存储中安装了颁发给server.mydomain.com的证书,客户端在同一位置安装了颁发给client.mydomain.com的证书。除此之外,服务器在本地计算机/受信任人员中拥有客户端的公共证书,客户端在本地计算机/受信任人员中拥有服务器的公共证书
最后,客户端被配置为检查服务器的证书。我使用配置文件中的system.servicemodel/behaviors/endpointBehaviors/clientCredentials/serviceCertificate/defaultCertificate
元素完成了此操作
到目前为止,一切正常。我的问题是,我想在服务器的配置文件中指定,只允许使用受信任人员证书存储中的client.mydomain.com证书标识自己的客户端连接
使用ServiceSecurityContext
在服务器上可以获得正确的信息,但我正在寻找一种方法,在app.config中指定WCF应该执行此检查,而不必从代码中检查安全上下文
可能吗?如有任何提示,将不胜感激
顺便说一下,到目前为止,我的服务器的配置文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="MyServer.Server" behaviorConfiguration="CertificateBehavior">
<endpoint contract="Contracts.IMyService" binding="customBinding" bindingConfiguration="SecureConfig">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost/SecureWcf"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CertificateBehavior">
<serviceCredentials>
<serviceCertificate storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="server.mydomain.com"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="SecureConfig">
<security authenticationMode="MutualCertificate"/>
<httpTransport/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
查看Codeplex上的页面-非常好而且非常有用的东西
特别是,请查看How-To,更具体地说是
它非常详细地解释了如何设置WCF服务,该服务要求其客户端提供有效的证书,以及如何检查该证书。如果只允许一个客户端,请仅将该证书专门部署到该客户端
希望这有帮助 似乎没有办法使用web.config实现我想要的功能 我最后添加了一个带有此标记的行为:
<clientCertificate>
<authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" revocationMode="NoCheck"/>
</clientCertificate>
然后将客户端的证书添加到服务器运行时作为用户的“受信任的人”证书存储中。这是一个很好的示例,但它只检查客户端是否有有效的证书—任何有效的证书。不是吗?如果一个不需要的客户机拥有根证书的公共部分,以便它可以验证服务器的证书,并且该不需要的客户机也拥有自己的证书,比如说VeriSign,那么它可以连接,不是吗?这正是我想要停止的。@Johan:取决于你在证书中检查的内容。我相信您可以向证书中添加某种序列号或其他内容,只要该密钥不存在(如果有人试图窃取证书的公共部分),您就不会接受它。该证书具有可分辨名称、序列号和指纹。我知道如何在代码中检查这三个。我在寻找一种方法,从app.config声明性地完成它,而不是强制地从代码中完成。但我想当我问这个问题时,我把身份验证和授权搞混了。更好的方法可能是对所有受信任的证书进行身份验证,然后在此基础上添加某种授权。也许我必须插入一些自定义代码,例如,以某种方式将证书映射到角色,然后依赖基于角色的授权。