如何使用证书保护3跳WCF外观服务?

时间:2009-12-18 19:56:16

标签: c# .net wcf ssl certificate

我最近开发了WCF Facade服务。我是WCF的新手,无法理解安全实现部分。

服务如下:

  • asp.net公共网站有一个WCF客户端,可以访问:
  • DMZ内的WCF Facade服务,后者又作为客户端访问:
  • 内部网络WCF服务

目前所有服务都使用WSHttpBinding。

我想在所有3台服务器之间使用X.509证书进行客户端/服务器身份验证(即公共客户端应用程序和外观服务使用证书相互验证,外观客户端和内部服务使用证书相互验证)。

有人可以逐步解释在生产环境中需要做些什么才能确保这一点?我引用的每篇文章和书籍都解释了makecert.exe的使用,但没有解释使用来自真实CA的生产证书。我知道这可能很容易,但我似乎无法理解所需的概念。

从受信任的CA,我有一个SSL证书,用于访问公共网站和SAN SSL证书,可通过主题备用名称应用于最多4个域名。如果我需要使用makecert.exe等来创建客户端证书等,我仍然在身份验证方面感到困惑。

理想情况下,所有服务/客户端配置都在app / web.config中(无代码)。我对所有三台服务器(公共Web服务器,facade / dmz服务器,内部Web服务器)具有完全管理访问权限。

任何见解或指导都会非常感激!

根据评论进行修改以提供更多详细信息:

  • 所有服务器的IIS 6
  • 面向公众的站点不需要用户身份验证。基本上,公众访问者以表格形式输入信息,这些信息由服务处理和处理。无需身份验证。
  • 付费EV SSL证书将用于确保公共访问者和网站之间的互动。

我感兴趣的是如何在不同的WCF客户端/服务之间实现相互证书认证/识别。所以:

  • 公共服务器上的WCF客户端和Facade / DMZ服务器上的WCF服务使用证书相互识别和进行身份验证
  • Facade / DMZ服务器上的WCF客户端和内部服务器上的WCF服务也可以使用证书相互识别和进行身份验证。

我有一个来自可信CA(DigiCert)的灵活SAN证书,如果可能,我想使用它进行身份验证。它可以通过主题备用名称支持最多4个DNS条目。

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:1)

经过多次调查和反复试验后,我想我已经解决了这个问题并找到了解决方案。

因为我使用简化的SSL解决方案(具有多个名称的SAN证书来保护内部Web服务器和DMZ服务器),所以我可以将相同的证书导入本地计算机\个人和本地计算机\受信任的人存储在这些服务器上,并存储到公共服务器的受信任的人员存储中。

从那里开始,在配置中我选择使用传输和消息安全性(TransportWithMessageCredential)的混合来通过证书强制执行HTTPS和消息级加密。

产生的服务行为配置:

<serviceBehaviors>
  <behavior name="MyCustomBehavior">
    ...
    <serviceCredentials>
    <serviceCertificate findValue="MySANCertName"
                        x509FindType="FindBySubjectName"
                        storeLocation="LocalMachine"
                        storeName="My" />            
    </serviceCredentials>
    ...
  </behavior>
</serviceBehaviors>

和绑定:

<wsHttpBinding>
  <binding name="MyWsBinding">
    <security mode="TransportWithMessageCredential">
      <message clientCredentialType="Certificate"/>
    </security>
  </binding>
</wsHttpBinding>

我使用的另一件事可能对那些在证书身份验证方面遇到问题的人有用,就是打开审核:

<serviceBehaviors>
  <serviceSecurityAudit 
    auditLogLocation="Application"
    messageAuthenticationAuditLevel="SuccessOrFailure"
    serviceAuthorizationAuditLevel="SuccessOrFailure" 
    suppressAuditFailure="false" />
  </behavior>
</serviceBehaviors>

以下参考资料最有助于实施我的解决方案:

http://notgartner.wordpress.com/2007/09/06/using-certificate-based-authentication-and-protection-with-windows-communication-foundation-wcf/ http://www.codeproject.com/KB/WCF/wcf_certificates.aspx?display=Print Essential Windows Communication Foundation For .NET Framework 3.5