我有两台机器之间的依赖于安全通信的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>
这是一个很好的例子,但它只检查该客户端具有有效的证书 - 任何有效的证书。不是吗?如果不需要的客户端具有公共部分的根证书,以便它可以验证服务器的证书,并且不需要的客户端也具有由VeriSign发布的自己的证书,则它可以连接,不是吗?这正是我想要阻止的。 –
@Johan:取决于您在证书中检查的内容。我相信你可以添加某种序列号或某种东西,只要该密钥不存在(如果有人设法窃取证书的公共部分),你就不会接受它。 –
证书具有专有名称,序列号和指纹。我知道如何检查代码中的所有三个。我正在寻找一种方法来从app.config中声明性地执行它,而不是从代码中强制执行。但是当我问这个问题时,我认为我的身份验证和授权混淆了。更好的方法可能是验证所有可信证书,然后在其上添加某种授权。也许我必须插入一些自定义代码以某种方式将认证映射到角色,然后依靠基于角色的授权。 –