【问题标题】:How to secure a 3-hop WCF facade service using certificates?如何使用证书保护 3 跳 WCF 外观服务?
【发布时间】:2009-12-18 19:56:15
【问题描述】:

我最近开发了 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 服务器)拥有完全的管理权限。

任何见解或指导将不胜感激!

根据 cmets 进行编辑以提供更多细节:

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

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

  • 公共服务器上的 WCF 客户端和 Facade/DMZ 服务器上的 WCF 服务使用证书相互识别和相互验证
  • Facade/DMZ 服务器上的 WCF 客户端和内部服务器上的 WCF 服务随后也会使用证书相互识别和验证。

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

感谢您提供的任何帮助!

【问题讨论】:

  • 限制答案的几个问题: - 服务是全部由 IIS 托管、使用 ServiceHost 自托管,还是混合使用? - 您是否希望客户端身份验证信息通过不同的层,或者您是否正在做一个受信任的子系统模型,其中唯一的“可变”凭据位于公共站点上,然后后端服务器具有固定的客户端证书? - 您是否需要基于客户端证书进行任何类型的授权,或者仅仅是存在由您的 CA 签署的客户端证书就足以进行完全访问? - 您打算如何为最终用户颁发客户端证书(Windows CA、makecert、pay Verisign)?
  • 另外,我不清楚最终用户是否正在使用证书,或者您是否有其他一些身份验证机制并且只想通过证书通过相互身份验证来保护服务器-服务器通信。

标签: c# .net wcf ssl certificate


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多