3

我正在尝试为 B2B 的 Web 服务设置 SSL 连接,并且需要在服务器上进行客户端身份验证。由于服务器托管的 URL 也可由普通用户通过浏览器访问,因此并非所有与主机的连接都需要进行客户端身份验证。只有特定的 URL 需要 client-auth 来验证调用者 X509 证书。我们使用的是基于 Tomcat 5.x 的 JBoss 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 应用程序服务器设置都支持我们的用户的特定隔离,我不希望在文件系统上到处配置信任库。我们需要从我们的数据库中以代码动态加载受信任的证书。自定义 JAAS 登录模块在 Web 级别执行此操作,并且它还分配角色,但是如果没有连接器信任库,则永远不会调用登录模块,连接在涉及 HTTP 之前在 SSL 级别终止。

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

4

1 回答 1