自定义SSL TrustManager for Java App服务器

时间:2011-10-19 02:18:33

标签: jboss x509 connector truststore

我正在尝试为B2B的Web服务设置SSL连接,并且需要在服务器上进行客户端身份验证。由于服务器托管的URL也可以通过浏览器从常规用户访问,因此并非所有与主机的连接都需要进行客户端身份验证。只有特定的URL才需要client-auth来验证呼叫者X509证书。我们使用的是JBoss 5.x,它基于Tomcat 5.x,因此我有一个类似的连接器配置:

      <Connector protocol="HTTP/1.1" SSLEnabled="true" 
       port="8443" address="${jboss.bind.address}" sslProtocol = "TLS" 
       scheme="https" secure="true"  enableLookups="true" clientAuth="false"
       keystoreFile="${jboss.server.home.dir}/conf/.myKeyStore"
       keystorePass="password1" />

如您所见,我已配置密钥库,因此我们可以提供签名证书,并且我有clientAuth = false,因为需要client-auth的特定URL将在web.xml中配置,如下所示:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>clientAuthResources</web-resource-name>
        <url-pattern>/clientauth/*</url-pattern>
         <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>authOnly</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>CLIENT-CERT</auth-method>
     <realm-name>myRealm</realm-name>
</login-config>
  <security-role>
    <role-name>authOnly</role-name>
</security-role>

通过自定义JAAS登录模块,我实际上可以在上面的连接器配置中使用它。我还特定了一个具有客户端证书的信任库。这就是我的问题所在。鉴于我们的应用程序的设置以及我们如何扩展,每个jboss应用程序服务器设置都支持我们用户的特定segentation,我不希望在文件系统上的所有位置配置信任库。我们需要在数据库的代码中动态加载可信证书。自定义JAAS登录模块在Web级别执行此操作,并且还分配角色,但是如果没有连接器信任库,则永远不会调用登录模块,在涉及HTTP gets之前,SSL级别的连接将终止。

经过对网络的大量研究后,我确定我需要在SSLContext / SSLSocketFactory中配置自定义X509TrustManager来解决这个问题。此自定义信任管理器还将验证存储在我们的数据库中的客户端证书。我已经创建了这个自定义信任管理器,但我似乎无法将其连接起来。有谁知道在jboss或tomcat 5.x中配置它的方法?我注意到在Tomcat 7中,以下配置在连接器trustManagerClassName上可用,但是对我来说这不是一个选项。我认为这是可能的,非常感谢任何帮助。