Tomcat服务器中双向SSL客户端证书密钥用法与扩展密钥用法验证问询
好问题!这是很多配置客户端证书认证时容易忽略的细节,咱们来详细说清楚:
Tomcat对客户端证书Key Usage和Extended Key Usage的验证情况
默认行为
默认情况下,Tomcat在验证客户端证书时,只会做基础校验:比如证书是否由信任库中的CA签发、是否过期、证书链是否完整。它不会主动验证Key Usage(密钥用法)和Extended Key Usage(扩展密钥用法)这两个字段。换句话说,哪怕你的客户端证书里没标记“客户端认证”的用途,只要证书本身是可信的,Tomcat默认照样会接受它。
如何开启这两项验证
如果你需要强制校验这两个扩展字段,得通过Tomcat连接器的配置来手动开启,具体分两种常用的连接器类型:
1. JSSE连接器(NIO/NIO2/默认HTTP连接器)
这类连接器依赖JDK自带的JSSE实现,要开启扩展验证,你需要:
- 首先在
server.xml的连接器配置里开启客户端证书认证:clientAuth="true"(或者"want",表示请求证书但不强制) - 然后在Tomcat启动时添加JVM参数,让JDK的JSSE严格验证证书用途:
这个参数会让JSSE自动检查:-Djdk.tls.client.certificateVerification=strict- Key Usage字段是否包含
digitalSignature(客户端认证必需的密钥用法) - Extended Key Usage字段是否包含OID
1.3.6.1.5.5.7.3.2(对应“客户端认证”的扩展用途)
- Key Usage字段是否包含
2. APR/OpenSSL连接器
如果你用的是基于OpenSSL的APR原生连接器,配置方式略有不同:
- 在
server.xml的连接器里设置clientAuth="true"和sslVerifyClient="require" - 确保OpenSSL版本支持扩展验证(一般OpenSSL 1.0.1及以上都支持),同时可以通过
sslOptions参数进一步强化验证规则,比如:
OpenSSL在开启强制客户端认证后,会自动验证Key Usage和Extended Key Usage中的客户端认证标记。<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" > <SSLHostConfig> <Certificate certificateKeystoreFile="conf/localhost-rsa.jks" type="RSA" clientAuth="true" sslVerifyClient="require" sslOptions="+SSL_OP_NO_SSLv3 +SSL_OP_NO_TLSv1"/> </SSLHostConfig> </Connector>
验证逻辑的实现主体
关于验证是不是由Tomcat连接器实现:Tomcat连接器本身不直接执行这些扩展验证,而是负责配置和触发底层的SSL库(JDK JSSE或OpenSSL)来完成。简单说,Tomcat给你提供了开关(比如clientAuth、JVM参数、APR配置项),告诉底层SSL库“要不要做这些严格校验”,而具体的验证逻辑是由SSL库来执行的。
内容的提问来源于stack exchange,提问作者Indunil Rathnayake
相关产品推荐
相关产品推荐

