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

时间:2015-05-06 16:31:35

标签: apache ssl jboss x509 ajp

我们有以下配置:

  1. Apache 2.2反向代理,终止HTTPS以进行SSL卸载。
  2. 公开SOAP服务的Jboss 6.1 EAP应用程序服务器
  3. Apache的配置与this文章中描述的一样。

    SOAP服务在无状态会话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";
        }
    
    }
    

    A" TestDomain"已配置。

    在当前设置中,序列号通过专用的HTTP标头传输,我们在JBOSS配置xml文件中使用自定义登录模块。这很有效。

    但是,我们希望尽可能应用标准机制。鉴于此设置不是那么古怪,必须有一种方法来访问登录模块配置中的X509证书信息(例如,使用BaseCertLoginModule)。

    这里有两个问题:

    1. documentation采用标准设置,其中SSL终止(看似认证)也是由JBOSS执行的。
    2. documentation似乎在假设 该证书"所有者"用于授权,而我需要subject.serialnumber并指定" TestRole"它。
    3. 我不确定如何继续这样做。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

解决方案开箱即用(经过一些游戏后)。 authMethod =" BASIC"必须设置为authMethod =" CLIENT-CERT"。所以:

  

@WebContext(contextRoot =" aa / url",urlPattern =" *",authMethod =   " CLIENT-CERT",transportGuarantee =" NONE",secureWSDLAccess = false)

接下来,您需要将角色/安全域指定为注释:

  

@SecurityDomain(" MyCertWebserviceDomain")
  @DeclareRoles(值=   {" 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]*), .*','\1') from dual)"/>
       </login-module>
    </authentication>
</security-domain>

从数据库中获取角色(例如MY_ROLE),并通过证书中的序列号编制索引。

协议需要在JBOSS中设置为AJP。

现在可以从安全主体中获取身份:sessionContext.getCallePrincipal().getName()