仅对某些特定资源请求客户端证书身份验证

时间:2014-02-12 17:05:58

标签: tomcat authentication servlets ssl x509

我正在Tomcat上部署一个webapp,最终应该成为一个提供多种服务的平台。有时我需要能够使用客户端证书对用户进行身份验证,但只有在访问某些servlet / url时才能验证证书并读取某些属性。

我得出的结论是,仅使用Tomcat和jsp / servlets,就不可能只使用Web应用程序的一部分来请求客户端证书身份验证。它是整个tomcat服务器,每次都在每个地方请求用户证书(clientAuth true或want),或者对此场景无用的web.xml授权设置。

是否有框架,应用程序服务器或某些经过验证的架构可用于实现此要求?我想过可能有一个专门用于相互ssl身份验证的单独服务器实例,重定向用户和转发会话参数,但这个选项似乎相当复杂。我打赌有类似的解决方案,只是想知道是否有一些参考实施,指南,无论如何......谢谢。

2 个答案:

答案 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的内容配置为单个文件的级别。这也为您提供了各种其他好处,如负载平衡。

相关问题