如何使用ssl通配符证书通过X509相互验证多个WCF服务器?

时间:2009-10-27 13:54:55

标签: .net wcf dns x509certificate

我有两个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   代理。

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

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

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

2 个答案:

答案 0 :(得分: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 );

答案 1 :(得分:0)

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

您没有使用传输安全性的任何原因?除非你有中间的Layer7路由,否则很容易上班......