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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

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

我已将证书安装到证书存储区,并且一切正常。在客户端,由于我正在使用测试证书,因此certificateValidationMode当前设置为“false”。

我的问题:

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

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

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

Identity check failed for outgoing message. The expected DNS identity of the remote endpoint was 'localhost' but the remote endpoint provided DNS claim 'Name-Of-Server-Computer'. If this is a legitimate remote endpoint, you can fix the problem by explicitly specifying DNS identity 'Name-Of-Server-Computer' as the Identity property of EndpointAddress when creating channel proxy.

所以这是我的问题:

  • 仅在使用测试/自签名证书时才进行身份检查?当我使用从CA购买的真实可信的证书部署应用程序时,身份检查仍会进行吗?
  • 有没有办法禁用身份检查?我知道我可以创建自己的自定义证书验证程序,但似乎没有办法使用这些验证程序来覆盖身份验证。
提问于
用户回答回答于

检查始终 - 而且应该是。基本上,WCF将检查证书颁发给服务所在的域名(yourcompany.com)或机器名称。这是一个安全检查,我永远不会禁用!否则,欺骗服务的任何人都可以使用制作成任意域名/机器名称的任何证书并获得您的流量 - 而不是您想要的!

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

用户回答回答于

这个问题的答案是在错误信息本身。在客户端你可以做到:

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

以任何预期取代“服务器”。通常这将是自签名证书的通用名称(CN)。这样做不会破坏安全性,前提是承担所有责任确保提供的证书有效,即创建自定义证书验证程序并在那里进行相关检查。

扫码关注云+社区