【问题标题】:How can I use a ssl wildcard certificate to mutually authenticate several WCF servers via X509?如何使用 ssl 通配符证书通过 X509 相互验证多个 WCF 服务器?
【发布时间】:2009-10-27 13:54:54
【问题描述】:

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

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

我拥有 *.mydomain.com 的通配符 ssl 证书。它已正确安装在相关商店中(即 Personal 用于加密和 Trusted Clients 用于身份验证)

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

我已更新 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.Connect : 连接失败 服务器服务器 2: System.ServiceModel.Security.MessageSecurityException: 传出身份检查失败 信息。预期的 DNS 身份 远程端点是 'server2.mydomain.com' 但远程 端点提供的 DNS 声明 'mydomain.com'。如果这是一个 合法的远程端点,你可以 通过显式解决问题 指定 DNS 身份“mydomain.com” 作为身份属性 创建通道时的 EndpointAddress 代理。

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

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

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

【问题讨论】:

    标签: .net wcf dns x509certificate


    【解决方案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 );
    

    【讨论】:

      【解决方案2】:

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

      您不使用传输安全性的原因是什么?除非你有中间的 Layer7 路由,否则工作起来要简单得多......

      【讨论】:

      • 是的,我的证书可以用作 X509 证书(刚问 Comodo)
      • 我正在使用传输安全性。这个 id 在绑定部分定义如下:
      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多