我正在尝试为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上可用,但是对我来说这不是一个选项。我认为这是可能的,非常感谢任何帮助。
答案 0 :(得分:0)
您可以编写自己的org.apache.tomcat.util.net.jsse.JSSEImplementation
并在连接器的SSLImplementation
属性中传递其完整的班级名称。
请参见此处的示例: