为什么WCF抱怨身份检查失败?

时间:2009-10-27 09:47:01

标签: wcf dns certificate identity

我正在创建一个WCF应用程序,我将使用证书加密客户端和服务器之间的通信。在我的开发环境中,我想使用我使用makecert创建的测试证书/自签名证书。 (只有服务器才有证书,客户端不会)。

我已将证书安装到证书库中,一切正常。在客户端上,certificateValidationMode当前设置为“false”,因为我正在使用测试证书。

我的问题:

在客户端的app.config中,我需要指定identity元素:

<endpoint ... >
   <identity>
      <dns value="<Name-Of-Server-Computer>"/>
   </identity>
</endpoint>

如果我删除了identity元素,当我尝试连接到服务器时,我在客户端收到以下错误消息:

  

外发邮件的身份检查失败。远程端点的预期DNS标识是“localhost”,但远程端点提供DNS声明“服务器名称 - 计算机”。如果这是一个合法的远程端点,您可以通过在创建通道代理时明确指定DNS标识“Name-Of-Server-Computer”作为EndpointAddress的Identity属性来解决问题。

所以这是我的问题:

  • 仅在使用测试/自签名证书时才进行身份检查吗?当我使用从CA购买的真实可信证书部署我的应用程序时,是否仍会进行身份检查?

  • 有没有办法禁用身份检查?我知道我可以创建自己的自定义证书验证器,但似乎没有办法使用这些来覆盖身份检查。

3 个答案:

答案 0 :(得分:32)

此问题的答案在错误消息本身中。在客户端上,您可以这样做:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server");
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity);

按照预期的方式替换“服务器”。通常,这将是您自签名证书的通用名称(CN)。 这样做不会破坏安全性,只要您负责确保所提供的证书有效,即创建自定义证书验证器并在那里进行相关检查。

答案 1 :(得分:11)

检查总是在 - 而且应该是。基本上,WCF将检查证书是否发布到域名(yourcompany.com)或服务所在的计算机名称。这是我永远不会禁用的安全检查!否则,欺骗您的服务的任何人都可以使用任意域名/机器名称的任何证书来获取您的流量 - 而不是您想要的!

因此,您需要确保生产服务器上的真实证书确实发布到生产服务器所属的域名,例如,如果您的生产服务器将位于“production.yourcompany.com”中,则需要将证书发送到该域。

马克

答案 2 :(得分:3)

certificateValidationMode应设置为“None”,而不是“false”......