作为 Java 网络应用程序的一部分,我希望通过浏览器证书实现客户端身份验证。我已经能够找到有关如何在客户端和服务器上生成和安装证书的信息。
在访问方面,我能找到的所有信息似乎都是关于配置对特定路径的访问,例如www.mydomain.com/securearea 并让服务器处理访问。
但是,我想根据用户是否提供有效的客户端证书来实现自定义行为,而不是一揽子访问 block 。本质上,我希望能够创建类似 hasValidClientCertificate()
的方法不幸的是,我无法找到任何关于如何以编程方式检查客户端是否具有 Java 有效证书的引用资料。我正在使用汤姆猫。这不是我的强项,因此非常感谢任何提示或建议。
非常感谢您的宝贵时间
保罗
最佳答案
您需要执行几个步骤
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 堆栈请求客户端证书,则设置为想要,但如果未提供则不会失败。
有关如何为 SSL 配置 Tomcat 的更好说明,请参阅 Tomcat 身份验证: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];
关于Java 手动客户端证书身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15483378/