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

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

我的问题:

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

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

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

传出消息的身份检查失败。远程端点的预期 DNS 身份是“localhost”,但远程端点提供的 DNS 声明是“服务器计算机名称”。如果这是合法的远程终结点,您可以通过在创建通道代理时显式指定 DNS 标识“服务器计算机名称”作为 EndpointAddress 的 Identity 属性来解决该问题。

这是我的问题:

  • 身份检查是否仅在使用测试/自签名证书时进行?当我使用从 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)。这样做不会破坏安全性,前提是您承担所有责任确保所提供的证书有效,即创建自定义证书验证器并在那里进行相关检查。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top