我正在Tomcat上部署一个webapp,最终应该成为一个提供多种服务的平台。有时我需要能够使用客户端证书对用户进行身份验证,但只有在访问某些servlet / url时才能验证证书并读取某些属性。
我得出的结论是,仅使用Tomcat和jsp / servlets,就不可能只使用Web应用程序的一部分来请求客户端证书身份验证。它是整个tomcat服务器,每次都在每个地方请求用户证书(clientAuth true或want),或者对此场景无用的web.xml授权设置。
是否有框架,应用程序服务器或某些经过验证的架构可用于实现此要求?我想过可能有一个专门用于相互ssl身份验证的单独服务器实例,重定向用户和转发会话参数,但这个选项似乎相当复杂。我打赌有类似的解决方案,只是想知道是否有一些参考实施,指南,无论如何......谢谢。
答案 0 :(得分:6)
我过去直接使用Tomcat使用客户端证书重新协商完成了这项工作。对于较新版本的Tomcat,配置可能略有改变,但这里的想法是:
配置连接器以进行客户端身份验证:设置其信任存储参数,但使用clientAuth="false"
。这在the Tomcat documentation:
如果希望SSL堆栈在接受连接之前需要来自客户端的有效证书链,则设置为true。如果您希望SSL堆栈请求客户端证书,则设置为要求,但如果未显示,则不会失败。除非客户端请求受使用CLIENT-CERT身份验证的安全约束保护的资源,否则false值(默认值)将不需要证书链。
在web.xml
文件中,使用以下内容:
<web-app>
<display-name>My Webapp</display-name>
<security-constraint>
<web-resource-collection>
<web-resource-name>App</web-resource-name>
<url-pattern>/</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>cert</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>
</login-config>
<security-role>
<role-name>cert</role-name>
</security-role>
</web-app>
当然,请使用您需要的网址格式调整web-resource-collection
。
答案 1 :(得分:1)
单独使用Tomcat无法做到这一点。客户端身份验证最多是每个webapp,或者您可以在server.xml Connector
元素中为整个容器设置它,无论其用途如何。
如果你需要每个资源,你可以通过在前面使用Apache HTTPD并让它终止SSL来获得它。 (它仍然会将标头中的客户端证书传递给Tomcat,以便Tomcat可以遵守关于使其可用于Web应用程序的Servlet规范。)然后,您几乎可以将所有关于SSL的内容配置为单个文件的级别。这也为您提供了各种其他好处,如负载平衡。