我有两个 WCF 服务器,都位于 mydomain.com 域(虚构的示例,如下面的 IP!),分别命名为 server1 和 server2。

它们都可以通过其公共 IP 地址(foo.1 和 2)进行访问,也可以通过它们所在的专用 LAN(即 192.168.0.1 和 192.168.0.2)进行访问

我拥有 *.mydomain.com 的通配符 ssl 证书。它已正确安装在相关商店中(即用于加密的个人和用于身份验证的受信任的客户端)

我希望我的两台服务器使用我的通配符证书在其本地网络地址上相互连接以进行身份​​验证。

我已经更新了 C:\Windows\System32\drivers\etc\hosts 文件,使其看起来像这样:

192.168.0.1     Server1.mydomain.com
192.186.0.2     Server2.mydomain.com

这些不是我解析 Server1.mydomain.com 时获得的 IP 地址(我宁愿获得 foo.1 - 2)

我还编辑了“mydomain.com”的 IPV4 本地接口的连接特定 DNS 后缀

我的证书在我的 Server.config 文件中是这样引用的(我已经删除了与身份验证无关的所有部分)

        <behavior name="ServerToServerBehavior" >
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online"/>
            </clientCertificate>
            <serviceCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="myServerAsClientBehaviorConfiguration">
          <clientCredentials>
            <clientCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de" storeLocation="LocalMachine"/>
            <serviceCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online" trustedStoreLocation="LocalMachine"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>

这在我自己的具有本地生成的 X509 证书的开发计算机上运行得很好,但在我的生产环境中,这是我得到的:

服务器.连接:无法连接到Server Server2:System.ServiceModel.Security.MessageSecurityException:传出标识检查失败 消息。预期的 DNS 标识 远程终结点是 “server2.mydomain.com”但遥控器 终结点提供的 DNS 声明 “mydomain.com”。如果这是一个 合法的远程端点,您可以 通过显式修复问题 指定 DNS 标识“mydomain.com” 作为 的 Identity 属性 创建通道时的 EndpointAddress 代理。

我试图让服务器回答 Server2.mydomain.com 而不仅仅是 mydomain.com,但没有成功。关于如何执行此操作有任何提示吗?

我也尝试过错误消息中建议的解决方案,但这似乎根本没有效果(其他用户似乎有 一样的问题 而且我还没有找到解决方案)。关于如何解决这个问题有什么想法吗?

编辑 :我已向我的证书提供商核实我确实可以使用它进行 X509 身份验证。

有帮助吗?

解决方案

我最终明白了为什么我的身份字段被忽略了。

我的端点是这样构造的:

DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", "net.tcp://server.mydomain.com/Server");

当提供 uri 参数时,DNS 身份字段(在 app.config 中定义)也会被覆盖(即使它是空的,当我们使用字符串而不是真实的 URI 对象时就是这种情况)。

解决方案是使用以下代码以编程方式设置它:

        System.ServiceModel.EndpointAddress uri = new System.ServiceModel.EndpointAddress(new Uri("net.tcp://server.mydomain.com/Server"),new System.ServiceModel.DnsEndpointIdentity("mydomain.com"),new System.ServiceModel.Channels.AddressHeader[0]);

        DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", uri );

其他提示

我认为错误所讨论的 DNS 声明覆盖将在客户端而不是服务器上指定,因此您不会通过进行该更改来打开任何内容,除非您的客户端可以成功连接到域中的任何服务器(如果它在听)。您看到的错误有点像消息安全性,相当于证书上的主机名不匹配。经过大量的努力后,我已经获得了与通配符证书一起使用的消息安全性,但是您可能需要执行一些自定义验证工作,因为您的证书可能没有指定客户端身份验证用法。

您不使用运输安全有什么原因吗?除非你有中间第 7 层路由,否则工作起来要简单得多......

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