如何在Tomcat中通过x.509证书对用户进行身份验证和授权

时间:2015-02-12 10:33:56

标签: java tomcat authentication servlets ssl

我想设置我的webapp以支持客户端证书身份验证。

我已经配置了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。

答案将被投票。

1 个答案:

答案 0 :(得分:0)

我知道,这个问题是在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的数组,第一个是用户选择的那个。因此,现在您可以使用数据库中的证书检查该证书