3.4. 配置安全域以使用基于证书的身份验证
JBoss EAP 让您能够通过安全域使用基于证书的身份验证来保护 Web 应用或 EJB 的安全。
在配置基于证书的身份验证之前,您需要启用并配置用于应用的双Way SSL/TLS,这需要为 JBoss EAP 实例以及访问由安全域保护的 Web 应用或 EJB 保护的任何客户端配置 X509 证书。
在配置了证书、信任存储和双向 SSL/TLS 后,您可以继续配置使用基于证书的身份验证的安全域,配置应用使用该安全域,并将客户端配置为使用客户端证书。
3.4.1. 使用基于证书的身份验证创建安全域
要创建使用基于证书的身份验证的安全域,您需要指定信任存储以及证书登录模块或其子类。
truststore 必须包含用于身份验证的任何可信客户端证书,或者必须包含用于为客户端的证书签名的证书颁发机构的证书。login 模块用于利用已配置的信任存储来验证客户端提供的证书。整个安全域还必须提供一种方式,在角色通过身份验证后将角色映射到主体。证书登录模块本身不会将任何角色信息映射到主体,但也可与另一个登录模块结合使用。另外,证书登录模块的两个子类( CertificateRoles 和 DatabaseCertificate )提供了在角色验证后将角色映射到主体的方法。以下示例演示了如何使用 CertificateRoles 登录模块为安全域配置基于证书的身份验证。
在进行身份验证时,安全域将使用客户端在建立双向 SSL/TLS 时提供的相同证书。因此,客户端必须通过应用或 EJB 对 BOTH 双向 SSL/TLS 使用相同的证书和基于证书的身份验证。
使用基于证书的身份验证的安全域示例
/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 ...