3.4. 配置安全域以使用基于证书的身份验证
JBoss EAP 让您能够通过安全域使用基于证书的身份验证来保护 Web 应用或 Jakarta 企业 Beans。
在配置基于证书的身份验证之前,您需要启用并配置 用于应用的双Way SSL/TLS,这需要为 JBoss EAP 实例以及访问 Web 应用或安全域保护的 Jakarta Enterprise Beans 配置 X509 证书。
在配置了证书、信任存储和双向 SSL/TLS 后,您可以继续配置使用基于证书的身份验证的安全域,配置应用使用该安全域,并将客户端配置为使用客户端证书。
3.4.1. 使用基于证书的身份验证创建安全域 复制链接链接已复制到粘贴板!
要创建使用基于证书的身份验证的安全域,您需要指定信任存储以及 证书 登录模块或其子类。
truststore 必须包含用于身份验证的任何可信客户端证书,或者必须包含用于为客户端的证书签名的证书颁发机构的证书。login 模块用于利用已配置的信任存储来验证客户端提供的证书。整个安全域还必须提供一种方式,在角色通过身份验证后将角色映射到主体。证书登录模块本身不会将任何角色信息映射到主体,但也可与另一个登录模块结合使用。另外,证书登录模块的两个子类( CertificateRoles 和 DatabaseCertificate )提供了在角色验证后将角色映射到主体的方法。以下示例演示了如何使用 CertificateRoles 登录模块为安全域配置基于证书的身份验证。
在进行身份验证时,安全域将使用客户端在建立双向 SSL/TLS 时提供的相同证书。因此,客户端必须使用相同的 BOTH 双向 SSL/TLS 证书,并使用应用程序或 Jakarta Enterprise Beans 进行基于证书的身份验证。
使用基于证书的身份验证的安全域示例
/subsystem=security/security-domain=cert-roles-domain:add
/subsystem=security/security-domain=cert-roles-domain/jsse=classic:add(truststore={password=secret, url="/path/to/server.truststore.jks"}, keystore={password=secret, url="/path/to/server.keystore.jks"}, client-auth=true)
/subsystem=security/security-domain=cert-roles-domain/authentication=classic:add
/subsystem=security/security-domain=cert-roles-domain/authentication=classic/login-module=CertificateRoles:add(code=CertificateRoles, flag=required, module-options=[ securityDomain="cert-roles-domain", rolesProperties="${jboss.server.config.dir}/cert-roles.properties",password-stacking="useFirstPass", verifier="org.jboss.security.auth.certs.AnyCertVerifier"])
上例使用 CertificateRoles login 模块来处理身份验证并将角色映射到经过身份验证的主体。它通过使用 rolesProperties 属性引用属性文件。此文件使用以下格式列出了用户名和角色:
user1=roleA
user2=roleB,roleC
user3=
由于提供的证书中的用户名作为 DN 显示,例如 CN=valid-client、OU=JBoss、O=红帽、L=Raleigh、ST=NC、C=US,您必须在使用属性文件时转义特殊字符,如 = 和空格:
角色属性文件示例
CN\=valid-client,\ OU\=JBoss,\ O\=Red\ Hat,\ L\=Raleigh,\ ST\=NC,\ C\=US=Admin
要查看证书的 DN:
$ keytool -printcert -file valid-client.crt
Owner: CN=valid-client, OU=JBoss, O=Red Hat, L=Raleigh, ST=NC, C=US
...
3.4.2. 配置应用以使用带基于证书的身份验证的安全域 复制链接链接已复制到粘贴板!
与将应用配置为使用其他形式身份验证的安全域类似,您需要同时正确配置 jboss-web.xml 和 web.xml 文件。
对于 jboss-web.xml,添加对您为基于证书的身份验证配置的安全域的引用。
jboss-web.xml 示例
<jboss-web>
<security-domain>cert-roles-domain</security-domain>
</jboss-web>
对于 web.xml,将 < 属性设置为 login-config> 中的 <auth-method >CLIENT-CERT。您还需要定义 <security-constraint> 和 <security-roles>。
web.xml 示例
<web-app>
<!-- URL for secured portion of application-->
<security-constraint>
<web-resource-collection>
<web-resource-name>secure</web-resource-name>
<url-pattern>/secure/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>All</role-name>
</auth-constraint>
</security-constraint>
<!-- Security roles referenced by this web application -->
<security-role>
<description>The role that is required to log in to the application</description>
<role-name>All</role-name>
</security-role>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>cert-roles-domain</realm-name>
</login-config>
</web-app>
3.4.3. 配置客户端 复制链接链接已复制到粘贴板!
客户端若要针对通过基于证书的身份验证保护的应用进行身份验证,客户端需要访问 JBoss EAP 实例的信任存储中包含的客户端证书。例如,如果使用浏览器访问应用,客户端需要将可信证书导入到浏览器的信任存储中。