为什么WCF抱怨过身份检查失败?(Why does WCF complain over identi

2019-09-01 11:09发布

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

我已经安装了证书导入证书存储区,和一切工作正常。 在客户端,certificateValidationMode当前被设定为“假”,因为我有一个测试证书工作。

我的问题:

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

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

如果我删除标识元素,我得到当我尝试连接到服务器的客户端出现以下错误信息:

身份确认失败传出消息。 远程端点的预期DNS身份“localhost”的,但远程端点提供的DNS要求“名称-OF-Server的计算机”。 如果这是一个合法的远程端点,您可以通过显式指定DNS身份“名称-OF-Server的计算机”为的EndpointAddress的标识属性创建通道代理时解决问题。

因此,这里是我的问题:

  • 是身份检查使用测试/自签名证书时仅做了什么? 当我使用从CA购买一个真实的,可信的,证书部署应用,将身份检查仍然进行?

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

Answer 1:

该检查是经常做 - 和应该的。 基本上,WCF将检查该证书颁发给您的服务所在的域名(yourcompany.com)或计算机名。 这是一个安全检查,我从来没有禁用! 否则,任何人欺骗你的服务可以使用任何证书,开出的任意域/计算机名并获得您的流量 - 不是你想要的!

所以,你需要做什么肯定的是,在生产服务器上您的真实证书确实发放给生产服务器将是,例如,如果你的生产服务器将是在“production.yourcompany.com”一部分域名,该证书需要被造出来到该域。



Answer 2:

在回答这个问题是在错误消息本身。 在客户端,你可以这样做:

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

替换“服务器”,以任何预期。 通常,这将是自签名证书的通用名称(CN)。 这样做不会破坏安全,只要你采取确保,所呈现的证书是有效的所有责任,那就是创建自定义证书验证,并作出相应的检查那里。



Answer 3:

certificateValidationMode应设置为“无”,而不是“假”?



文章来源: Why does WCF complain over identity check failure?