2009-12-18 50 views
2

我最近开发了一个WCF Facade服务。我是WCF的新手,无法理解安全实现部分。如何使用证书来保护3跳WCF外观服务?

该服务如下:

  • 一个asp.net公共网站具有WCF客户端,它访问:一个DMZ,内
  • 甲WCF门面服务这又充当客户端来访问:
  • 内部网络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服务门面/ DMZ服务器上
  • WCF客户端相互识别和相互使用证书认证
  • 内部服务器上的门面/ DMZ服务器和WCF服务
  • WCF客户端,然后还互相识别并使用证书对彼此进行身份验证。

我从受信任的CA(DigiCert)获得灵活的SAN证书,如果可能的话,我希望使用它来进行身份验证。它可以通过主题替代名称支持多达4个DNS条目。

感谢您提供任何帮助!

+0

一些问题,制约了答案: - 是服务的所有IIS托管,自托管瓦特/的ServiceHost,或组合? - 您是否期望客户端身份验证信息通过不同的层,或者您是否正在执行受信任的子系统模型,其中唯一的“变量”凭据位于公共站点上,那么后端服务器具有固定的客户端证书? - 您是否需要根据客户端证书进行任何类型的授权,或者仅仅是由您的CA签署的客户端证书的存在足以完全访问? - 您打算如何为最终用户颁发客户端证书(Windows CA,makecert,付费威瑞信)? – nitzmahone 2009-12-19 02:45:50

+0

另外,我不清楚最终用户是否使用证书,或者您是否有其他身份验证机制,并且只想通过证书通过相互身份验证来保护服务器 - 服务器通信。 – nitzmahone 2009-12-19 02:47:19

回答

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> 

以下参考文献对我最有帮助mplementing我的解决方案:

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