2010-02-16 31 views
4

我有两台机器之间的依赖于安全通信的WCF客户端/服务的应用程序标识的单个客户端,我想使用已安装在证书存储在使用X509证书相互识别服务器和客户端。我通过将绑定配置为<security authenticationMode="MutualCertificate"/>来完成此操作。只有客户端机器。如何配置WCF服务,只接受由X509证书

服务器具有颁发给server.mydomain.com安装在本地计算机/个人存储中的证书和客户端发出client.mydomain.com安装在同一个地方的证书。除此之外,服务器在本地计算机/受信任的人员中拥有客户端的公共证书,并且客户端在本地计算机/受信任的人员中拥有该服务器的公共证书。

最后,客户端已配置为检查服务器证书。我在配置文件中使用了system.servicemodel/behaviors/endpointBehaviors/clientCredentials/serviceCertificate/defaultCertificate元素。

到目前为止好,这一切工作。我的问题是,我想在服务器的配置文件中指定只允许客户端使用来自Trusted People证书存储区的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

似乎没有成为一个办法做到我想用什么样的web.config。

我最终加入了行为与此标签:

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

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

1

退房Codeplex上的WCF Security Guidance页面 - 优秀的,非常有用的东西!

特别是,检查出的操作方法的甚至更具体的

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

它解释的很详细了如何设置要求客户出示有效证书WCF服务,如何检查。如果您只想允许单个客户端,则只将该证书专门部署到该单个客户端。

希望这会有所帮助!

+0

这是一个很好的例子,但它只检查该客户端具有有效的证书 - 任何有效的证书。不是吗?如果不需要的客户端具有公共部分的根证书,以便它可以验证服务器的证书,并且不需要的客户端也具有由VeriSign发布的自己的证书,则它可以连接,不是吗?这正是我想要阻止的。 –

+0

@Johan:取决于您在证书中检查的内容。我相信你可以添加某种序列号或某种东西,只要该密钥不存在(如果有人设法窃取证书的公共部分),你就不会接受它。 –

+0

证书具有专有名称,序列号和指纹。我知道如何检查代码中的所有三个。我正在寻找一种方法来从app.config中声明性地执行它,而不是从代码中强制执行。但是当我问这个问题时,我认为我的身份验证和授权混淆了。更好的方法可能是验证所有可信证书,然后在其上添加某种授权。也许我必须插入一些自定义代码以某种方式将认证映射到角色,然后依靠基于角色的授权。 –