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

use*_*912 3 authentication ssl tomcat servlets x509

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

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

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

Bru*_*uno 6

我过去直接使用Tomcat,使用客户端证书重新协商完成了这项工作.对于较新版本的Tomcat,配置可能略有改变,但这是一个想法:

  • 配置连接器以进行客户端身份验证:设置其信任存储参数,但使用clientAuth="false".这在Tomcat文档中有记录:

    如果希望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>
    
    Run Code Online (Sandbox Code Playgroud)

    当然,请web-resource-collection使用您需要的URL模式.