下载
Oracle WebLogic Server
示例代码
  标签
weblogic, security, 全部
架构师:安全性

如何为 Oracle WebLogic Server 设置 X509 证书身份验证

作者:David Damo 和 Brian Peng

2008 年 11 月发表

许多安全性架构师误以为配置双向 SSL 足以验证客户端和限制仅访问受信任客户端。事实并非如此。实际上,许多人仅通过 Verisign 设置双向 SSL,尽管 Verisign 是专为信任而设计的,而不是针对身份验证或任何其他类型的应用程序访问限制。

在此方法文档中,您将了解如何创建自定义的用户名映射器类,它可以将各种证书属性映射到您安全领域中的一个用户,然后您可以对该领域进行身份验证并使用它限制或允许对应用程序的访问。此方法文档还将介绍如何配置您的 Oracle WebLogic 应用服务器,以便用于对从客户端传递到服务器的证书进行身份验证,从而限制客户端对应用程序的访问。

我们参加了无数的会议,客户建议使用双向 SSL 验证客户端的身份和限制对应用程序的访问。几乎在所有案例中,客户都希望使用受信任的第三方来验证证书的身份。这很重要,因为您希望受信任的第三方来验证证书的身份,但设置一个不带任何证书身份验证的双向 SSL — 至少在 Oracle WebLogic Server 中 — 将允许所有具有有效 Verisign 证书的客户端连接到您的服务器。这通常不是客户所希望的,尤其是在客户使用双向 SSL 的情况下。

SSL 是数据加密的入口,因为您要发送的数据已经加密,双向 SSL 意味着连接的两端使用 X509 证书类型建立了信任,记住这一点很重要。然而,基于证书的身份验证用于对使用数字证书访问 WebLogic 服务器的用户进行身份验证,可以使用许多证书/令牌类型(包括 X509、X501 和 CSlv2)。在本文中,将只讨论 X509 证书类型。

当我们建议设置双向 SSL 不支持在不进行任何更改的情况下使用基于证书的身份验证来连接应用程序时,大多数客户端建议在防火墙上进行更改或者在 WebLogic 上使用连接筛选器以保护应用程序,而不是实施基于证书的身份验证。这两个主意都很棒,但它们应该用于完善基于证书的身份验证过程,以实现最大安全性。我们都知道很可能发生 IP 欺诈,因此设置尽可能多的障碍,以便只允许受信任的客户端连接到您的应用程序,这很关键。

在此处描述的示例中,我们实施默认 Identity Assertor 的 Custom User Name Mapper 选项,因为我们找不到有关如何开发该类的示例。WebLogic 自带了默认的用户名映射器,可以将各种 X509、X501 和 CSlv2 证书属性简单映射到用户。Custom User Name Mapper 选项最初是为了默认用户名映射器提供的基本用户名映射之外的自定义用户名映射创建的。在我们的示例中,自定义用户名映射器将 X509 证书的 CN 属性映射到一个有效用户。

您可以从此处下载一个包含自定义用户名映射器类的 zip,该类将 CN 映射到 Weblogic 安全领域中的一个用户。您可以轻松地更新该类,将任何 X509 证书属性映射到安全领域中的一个用户,或者使用该类作为模板进行自定义。在本示例中,我们将假定您已经设置了双向 SSL。

我们按照以下屏幕截图所示编译该类,然后将该类添加到一个 JAR 文件中,稍后将该文件添加到域中服务器的所有类路径。

图

将自定义用户名映射器类添加到默认 identity assertor。为了使应用程序能够访问默认 identity assertor,将以下内容添加到您的 web.xml 中。

<login-config>
    <auth-method>CLIENT-CERT</auth-method>
  </login-config>
当您的自定义用户名映射器添加到类路径之后,登录管理控制台,在 Security Realms->myrealm->Providers 下选择 Default Identity Assertor。确保您位于 Common 选项卡下,默认情况下应位于此选项卡下,在 ActiveTypes 下确认选择了 X.509 作为选项。

图

现在,选择默认 identity assertor 的 Provider Specific 选项卡。确认将以下值设置为如下所示。在我们的示例中,我们尚未启用默认用户名映射器。

将适当的用户名映射器类添加到 User Name Mapper Class Name 域中。在我们的示例中,该类为 com.security.userNameMapper.CustomUserNameMapperImpl。

图

进行更改后,应重新启动服务器以确保您正确配置了您的自定义用户名映射器。进行这些操作之前,您可能需要完成两件事。

首先,启用调试以确保您的默认 identity assertor 得到正确触发和初始化。您可以通过为服务器的 Java 参数添加开关(如果您知道)来实现此任务。如果您不知道,则在服务器的调试选项下启用它:选择 WebLogic->Security->Atn 并启用 DebugSecutityAtn

图

其次,您可能希望先删除缓存,然后再重新启动服务器。由于某种原因,我们必须删除缓存,这样服务器才能挑选自定义用户名映射器。您可以删除缓存,删除 tmp 目录,清除 WebLogic 服务器目录下的缓存(位于 WL_HOME/servers/ServerName 下面)。

为了确保自定义用户名映射器配置正确,检查以下输出的输出日志:

<Jul 14, 2008 5:18:57 PM EDT> <Notice> <Stdout> <000000> 
<Creating Custom User Name Mapper Implementation with Subject DN of CN and delimiter of>
如果您希望跟踪完整的 identity assertor 调用,确认您已经按照前面的说明在 Server Debug 选项卡中启用了 DebugSecurityAtn,您将能够查看 identity assertor 的运行并调试任何问题。

您确认自定义用户名映射器正确部署之后,必须在管理控制台中配置您的应用程序以及一个角色、组和用户,将您的应用程序限制为仅允许特定证书访问。

我们建议将应用程序设置为引用不在应用程序部署描述符中定义的角色(外部定义的角色)。这样您不必在每次将一个新证书属性添加为用户时都更改代码,只需将新证书属性添加到一个组,该组是您应用程序中定义的某个角色的一部分。

我们在此处创建的代码外部引用了 Certificate 角色,因此您需要在管理控制台中创建一个名为 Certificate 的全局角色。

图

添加了该角色之后,创建一个组。例如,我们创建了一个名为 AcceptedCertificates 的组。

图

返回该角色下,将该组作为一个条件添加到该角色。因此所有将添加到该组的用户(证书属性)将成为您刚创建的角色的一部分。

图

然后,创建证书的 CN 作为您希望有权访问您应用程序的用户,并将他们添加到之前创建的组。

图

假定您已经完成上述步骤,您只需重新启动服务器或者重新部署应用程序,以便将来添加 CN 用户组。

开发人员需要将他们的应用程序设置为使用您在上面定义的角色。如果证书 CN 是一个用户,将对其进行身份验证,因此通过 Web 应用程序安全性最佳实践设置应用程序。

在 weblogic.xml 中,添加以下粗体标记:

<?xml version='1.0' encoding='ISO-8859-1'?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <context-root>TestService</context-root>
  <security-role-assignment>
    <role-name>Certificate</role-name>
    <externally-defined
  </security-role-assignment>
</weblogic-web-app>
这个外部定义的标记告诉 WebLogic 我们示例中的角色及其用户是在管理控制台中定义的,而不是在部署描述符中定义的。

向 web.xml 中添加以下的粗体内容:

<?xml version='1.0' encoding='ISO-8859-1'?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <display-name>TestServiceWebApp</display-name>
  <servlet>
    <servlet-name>TestServiceServlethttp</servlet-name>
    <servlet-class>com.test.TestServiceImpl</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServiceServlethttp</servlet-name>
    <url-pattern>/TestServiceImpl</url-pattern>
  </servlet-mapping>
  
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>SecurePages</web-resource-name>
      <description>Security constraint for resources in the secure directory</description>
      <url-pattern>/*</url-pattern>
      <http-method>POST</http-method>
      <http-method>GET</http-method>
    </web-resource-collection>
	
    <auth-constraint>
      <description>only let the system user login </description>
      <role-name>Certificate</role-name>
    </auth-constraint>
	
    <user-data-constraint>
      <description>For SSL</description>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
   </security-constraint>
   
  <login-config>
    <auth-method>CLIENT-CERT</auth-method>
  </login-config>
  <security-role>
    <description>The Secure ROLE</description>
    <role-name>Certificate</role-name>
  </security-role>
</web-app>
  • CLIENT-CERT 认证方法触发 identity assertor。
  • security-role 标记引用 weblogic.xml 中的角色。
  • user-data-constraint 标记告诉 WebLogic 在客户端和服务器之间使用 SSL。
  • auth-constraint 标记允许访问作为角色在标记中定义的用户。

结论

现在您已经完成本配置,您可以将所需的 X509 证书属性与可以认证为有效负责人的用户相关联。然后,使用 Web 应用程序安全性标准和最佳实践,您的应用程序可以设置为只允许几个证书访问。


David DamoBrian Peng 作为高级工程师供职于加拿大的一家大型银行。他们在中间件基础架构部署、设计、开发、安全性和集成方面具有广泛的经验。虽然他们专攻中间件,但他们同样喜欢掌握系统管理任务和技术。
寄送此页面
Printer View 打印机视图