如何将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的证书。除此之外,服务器在本地计算机/受信任人员中拥有客户端的公共证书,客户端在本地计算机/受信任人员中拥有服务器的公共证书 最后,客户端被配置为检查服务器的证书。我使用配置文

我有一个WCF客户端/服务应用程序,它依赖于两台机器之间的安全通信,我想使用证书存储中安装的x509证书来相互识别服务器和客户端。为此,我将绑定配置为
。只有客户端计算机

服务器在本地计算机/个人存储中安装了颁发给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声明性地完成它,而不是强制地从代码中完成。但我想当我问这个问题时,我把身份验证和授权搞混了。更好的方法可能是对所有受信任的证书进行身份验证,然后在此基础上添加某种授权。也许我必须插入一些自定义代码,例如,以某种方式将证书映射到角色,然后依赖基于角色的授权。