如何访问 JBOSS 中的 X509 subject.serialnumber 6 EAP icm AJP 和 SSL 卸载
How to access X509 subject.serialnumber in JBOSS 6 EAP icm AJP and SSL offloading
我们有以下配置:
- Apache 2.2 反向代理,终止 HTTPS 以进行 SSL 卸载。
- A Jboss 6.1 EAP 应用服务器公开 SOAP 服务
Apache 配置如 this 文章中所述。
SOAP 服务在无状态 session bean 中实现。像这样:
@WebContext( urlPattern = "/ba/test", authMethod = "BASIC", transportGuarantee = "NONE", secureWSDLAccess = false )
@Stateless
@WebService
@SecurityDomain( "TestDomain" )
@RolesAllowed("TestRole")
public class TestSsb {
@WebMethod
public String testMe(String in) {
return "succeeded";
}
}
已配置 "TestDomain"。
在当前设置中,序列号通过专用 HTTP header 传输,我们在 JBOSS 配置 xml 文件中使用自定义 login-module。这行得通。
但是,我们希望尽可能应用标准机制。鉴于此设置并不奇怪,必须有一种方法可以在 login-module 配置中访问 X509 证书信息(例如使用 BaseCertLoginModule)。
这里有2个问题:
- documentation 采用标准设置,其中 SSL 终止(似乎是身份验证)也由 JBOSS 执行。
- documentation 似乎假设
该证书 "owner" 用于授权,而我需要 subject.serialnumber 并将 "TestRole" 分配给它。
我不确定如何继续此操作。任何帮助将不胜感激。
该解决方案开箱即用(经过一番尝试)。 authMethod = "BASIC" 必须设置为 authMethod = "CLIENT-CERT"。所以:
@WebContext( contextRoot = "aa/url", urlPattern = "*", authMethod =
"CLIENT-CERT", transportGuarantee = "NONE", secureWSDLAccess = false )
接下来,您需要将角色/安全域指定为注释:
@SecurityDomain( "MyCertWebserviceDomain" )
@DeclareRoles( value =
{"MY_ROLE" } )
通过指定 DatabaseCertLoginModule。
<security-domain name="MyCertWebserviceDomain">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseCertLoginModule" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/DS"/>
<module-option name="verifier" value="org.jboss.security.auth.certs.AnyCertVerifier"/>
<module-option name="rolesQuery" value="select role_name, 'Roles' from identity_role where identity IN(select regexp_replace(?, '.*SERIALNUMBER=([0-9]*), .*','') from dual)"/>
</login-module>
</authentication>
</security-domain>
角色(例如 MY_ROLE)是从数据库中获取的,并通过证书中的序列号进行索引。
需要在 JBOSS 中将协议设置为 AJP。
现在可以从安全主体获取身份:sessionContext.getCallePrincipal().getName()
。
我们有以下配置:
- Apache 2.2 反向代理,终止 HTTPS 以进行 SSL 卸载。
- A Jboss 6.1 EAP 应用服务器公开 SOAP 服务
Apache 配置如 this 文章中所述。
SOAP 服务在无状态 session bean 中实现。像这样:
@WebContext( urlPattern = "/ba/test", authMethod = "BASIC", transportGuarantee = "NONE", secureWSDLAccess = false )
@Stateless
@WebService
@SecurityDomain( "TestDomain" )
@RolesAllowed("TestRole")
public class TestSsb {
@WebMethod
public String testMe(String in) {
return "succeeded";
}
}
已配置 "TestDomain"。
在当前设置中,序列号通过专用 HTTP header 传输,我们在 JBOSS 配置 xml 文件中使用自定义 login-module。这行得通。
但是,我们希望尽可能应用标准机制。鉴于此设置并不奇怪,必须有一种方法可以在 login-module 配置中访问 X509 证书信息(例如使用 BaseCertLoginModule)。
这里有2个问题:
- documentation 采用标准设置,其中 SSL 终止(似乎是身份验证)也由 JBOSS 执行。
- documentation 似乎假设 该证书 "owner" 用于授权,而我需要 subject.serialnumber 并将 "TestRole" 分配给它。
我不确定如何继续此操作。任何帮助将不胜感激。
该解决方案开箱即用(经过一番尝试)。 authMethod = "BASIC" 必须设置为 authMethod = "CLIENT-CERT"。所以:
@WebContext( contextRoot = "aa/url", urlPattern = "*", authMethod = "CLIENT-CERT", transportGuarantee = "NONE", secureWSDLAccess = false )
接下来,您需要将角色/安全域指定为注释:
@SecurityDomain( "MyCertWebserviceDomain" )
@DeclareRoles( value = {"MY_ROLE" } )
通过指定 DatabaseCertLoginModule。
<security-domain name="MyCertWebserviceDomain">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseCertLoginModule" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/DS"/>
<module-option name="verifier" value="org.jboss.security.auth.certs.AnyCertVerifier"/>
<module-option name="rolesQuery" value="select role_name, 'Roles' from identity_role where identity IN(select regexp_replace(?, '.*SERIALNUMBER=([0-9]*), .*','') from dual)"/>
</login-module>
</authentication>
</security-domain>
角色(例如 MY_ROLE)是从数据库中获取的,并通过证书中的序列号进行索引。
需要在 JBOSS 中将协议设置为 AJP。
现在可以从安全主体获取身份:sessionContext.getCallePrincipal().getName()
。