3

我有两个 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)

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

我的证书在我的 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.Connect:无法连接到服务器 Server2:System.ServiceModel.Security.MessageSecurityException:传出消息的身份检查失败。远程端点的预期 DNS 身份是“server2.mydomain.com”,但远程端点提供了 DNS 声明“mydomain.com”。如果这是一个合法的远程端点,您可以通过在创建通道代理时将 DNS 身份“mydomain.com”明确指定为 EndpointAddress 的 Identity 属性来解决此问题。

我试图让服务器回答 Server2.mydomain.com 而不仅仅是 mydomain.com,但没有成功。关于如何做到这一点的任何提示?

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

编辑:我已经与我的证书提供商确认我确实可以将它用于 X509 身份验证。

4

2 回答 2

1

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

我的端点是这样构造的:

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 );
于 2009-10-28T15:55:43.393 回答
0

我认为 DNS 声明覆盖错误正在讨论将在客户端而不是服务器上指定,因此除了您的客户端可以成功连接到您域中的任何服务器(如果它在听)。您看到的错误有点像证书上主机名不匹配的消息安全性等价物。经过大量的努力,我已经获得了使用通配符证书的消息安全性,但是您可能必须进行一些自定义验证工作,因为您的证书可能没有指定客户端身份验证用法。

您不使用传输安全性的任何原因?除非您有中间的第 7 层路由,否则工作起来要简单得多……

于 2009-10-28T01:53:00.163 回答