Java手动客户端证书认证

时间:2013-03-18 17:43:52

标签: java authentication tomcat client

作为Java Web应用程序的一部分,我希望通过浏览器证书实现客户端身份验证。我已经能够找到有关如何在客户端和服务器上生成和安装证书的信息。

在访问方面,我能找到的所有信息似乎都是关于配置对特定路径的访问,例如www.mydomain.com/securearea并让服务器处理访问权限。

但是,我想根据用户是否提供有效的客户端证书而不是全面访问块来实现自定义行为。基本上我希望能够创建像 hasValidClientCertificate()

这样的方法

不幸的是,我无法找到任何关于如何以编程方式检查客户端是否具有Java有效证书的参考。我正在使用Tomcat。这不是我强大的领域,所以非常感谢任何提示或建议。

非常感谢你的时间

1 个答案:

答案 0 :(得分:1)

您需要执行几个步骤

1)配置tomcat以执行客户端证书身份验证(在server.xml中):

<Connector port="8443" 
protocol="HTTP/1.1" 
SSLEnabled="true"          
maxThreads="150" 
minSpareThreads="25" 
maxSpareThreads="75"
enableLookups="false" 
disableUploadTimeout="true"
acceptCount="100" 
keyAlias="tomcat"
debug="0" 
scheme="https" 
secure="true"
clientAuth="want" 
sslProtocol="TLS" 
keystoreFile="server.keystore" keystorePass="changeit" 
truststoreFile="trust.keystore" truststorePass="changeit"/>

http://tomcat.apache.org/tomcat-7.0-doc/config/http.html关于clientAuth属性的澄清:

如果您希望SSL堆栈请求客户端证书,

设置为想要,但如果没有提供,则

请参阅Tomcat身份验证以获得有关如何配置Tomcat for SSL的更好说明:http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html

2)使用以下代码实现hasValidClientCertificate():

X509Certificate[] crts = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
if (crts!= null && crts.length > 0) {
    return true;        
}

3)如果您需要访问用户证书,请访问

X509Certificate userCert = crts [0];