如何访问 JBOSS 中的 X509 subject.serialnumber 6 EAP icm AJP 和 SSL 卸载

How to access X509 subject.serialnumber in JBOSS 6 EAP icm AJP and SSL offloading

我们有以下配置:

  1. Apache 2.2 反向代理,终止 HTTPS 以进行 SSL 卸载。
  2. 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个问题:

  1. documentation 采用标准设置,其中 SSL 终止(似乎是身份验证)也由 JBOSS 执行。
  2. 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()