如何将WCF服务配置为仅接受由x509证书标识的单个客户端

时间:2010-02-16 21:45:49

标签: wcf web-services security ws-security x509certificate

我有一个WCF客户端/服务应用程序,它依赖于两台计算机之间的安全通信,我想使用证书存储中安装的x509证书来识别彼此的服务器和客户端。我通过将绑定配置为<security authenticationMode="MutualCertificate"/>来完成此操作。只有客户机。

服务器具有颁发给安装在本地计算机/个人存储中的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>

2 个答案:

答案 0 :(得分:2)

似乎无法使用web.config执行我想要的操作。

我最后添加了一个带有此标记的行为:

<clientCertificate>
  <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" revocationMode="NoCheck"/>
</clientCertificate>

然后将客户端的证书添加到服务器运行的用户的“可信人”证书存储区。

答案 1 :(得分:1)

查看Codeplex上的WCF Security Guidance页面 - 非常有用的东西!

特别要查看操作方法,更具体地说是

How To – Use Certificate Authentication and Message Security in WCF calling from Windows Forms

它详细解释了如何设置WCF服务,该服务要求其客户端提供有效证书,以及如何检查。如果您只想允许单个客户端,请仅将该证书专门部署到该单个客户端。

希望这有帮助!