我想设置我的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。
答案将被投票。
答案 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的数组,第一个是用户选择的那个。因此,现在您可以使用数据库中的证书检查该证书