【问题标题】:How to authenticate and authorize a user through x.509 certificate in Tomcat如何通过 Tomcat 中的 x.509 证书对用户进行身份验证和授权
【发布时间】:2015-02-12 10:33:55
【问题描述】:

我想设置我的 web 应用程序以支持客户端证书身份验证。

我已经配置了tomcat的连接器:

<Connector SSLEnabled="true" clientAuth="want"  keystoreFile="***" keystorePass="***" keystoreType="JKS" port="8443" protocol="HTTP/1.1" scheme="https" secure="false" sslProtocol="TLS" truststoreFile="***" truststorePass="***" truststoreType="JKS"/>

Web.xml 配置:

<login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>My APP</realm-name>
</login-config>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>restricted access datasets</web-resource-name>
        <url-pattern>/restrictedAccess/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>restrictedDatasetUser</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint >
</security-constraint>

当我尝试访问 https://../restrictedAccess/ 时,浏览器要求提供证书,我选择了我的证书,但页面未显示,因为它抛出此错误:403 forbiden。

我想做两件事:

自己验证用户。获取 CN,查找用户详细信息,然后进行身份验证。我的用户名和 CN 不一样。

我自己授权用户从数据库获得授权。

是否可以在不使用 Spring Security 的情况下完成这两件事?我不知道如何使用 servlet 自己进行身份验证,因为我习惯了 Spring Security。

答案将被投票。

【问题讨论】:

    标签: java tomcat authentication servlets ssl


    【解决方案1】:

    我知道,这个问题是在 3 多年前提出的,但最近我遇到了同样的问题,所以这里是可能的解决方法:

    1) 首先,您应该将 clientAuth 设置为 false。这样您就可以随时要求 tomcat 自行授权用户。

    2) 然后在你的代码中,在我的例子中,它是在控制器的 post 方法中,你可以要求 tomcat 通过这个方法向用户请求证书:

    import java.lang.reflect.Field;
    import java.security.cert.X509Certificate;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.catalina.connector.Request;
    import org.apache.coyote.ActionCode;
    import org.apache.tomcat.util.net.SSLSupport;
    
    .........
    
    public X509Certificate[] requestAndGetClientCertificate(
                ServletRequest servletRequest ) {
            X509Certificate[] result = new X509Certificate[0];
            try {
                // get protected org.apache.catalina.connector.Request
                // using reflection
                Field apacheRequest = servletRequest.getClass().getDeclaredField("request");
                apacheRequest.setAccessible(true);
                Request catalinaRequest = (Request) apacheRequest.get(servletRequest);
                org.apache.coyote.Request coyoteRequest = catalinaRequest.getCoyoteRequest();
                // here we invoke a browser certificate prompt window
                coyoteRequest.action(ActionCode.REQ_SSL_CERTIFICATE, null);
                result = (X509Certificate[]) coyoteRequest.getAttribute(SSLSupport.CERTIFICATE_KEY);
            } catch (Exception e) {
            }
            return result;
        }
    

    您需要将 catalina.jar 和 tomcat-coyote.jar 添加到您的类路径中。

    3) 该方法返回 X509Certificate 数组,第一个是用户选择的数组。因此,现在您可以使用数据库中的证书检查该证书

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 2015-12-12
      • 1970-01-01
      • 2018-01-31
      • 2011-09-15
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      相关资源
      最近更新 更多