我正在尝试为B2B的web服务设置SSL连接,并且需要在服务器上进行客户端身份验证。由于服务器承载的URL也可以通过浏览器从常规用户访问,所以并不是所有到主机的连接都需要进行客户端-auth。只有特定的URL才需要客户端-auth来验证调用方X509证书。我们使用的是JBoss 5.x,它基于Tomcat5.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作为需要客户端的特定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 getes涉及之前,连接将在SSL级别终止。
在对web进行了大量研究之后,我确定我需要在SSLContext/SSLSocketFactory中配置一个自定义X509TrustManager来解决这个问题。此自定义信任管理器还将验证存储在数据库中的客户端证书。我已经创建了这个自定义信任管理器,但是我似乎无法将它连接起来。有人知道如何在jboss或tomcat5.x中配置吗?我注意到在Tomcat 7中,连接器trustManagerClassName上有以下配置,但是这对我来说不是一个选项。我认为这是可能的,任何帮助都是非常感谢的。
发布于 2011-12-05 22:28:51
您可以编写自己的org.apache.tomcat.util.net.jsse.JSSEImplementation,并在连接器的SSLImplementation属性中传递它的完整类名。
见这里的例子:
https://stackoverflow.com/questions/7815859
复制相似问题