Tomcat 8到9 SSL是否有关键变更?同配置报算法不匹配错误
Tomcat 8到9的SSL关键变更说明
两个版本确实存在SSL双向认证相关的默认逻辑变更,和运行环境用Java 8还是Java 17没有直接关系,变更点直接触发了对应报错:
- Tomcat 8.5.8属于8.5分支早期版本,在TLS握手触发客户端证书请求时,会直接将当前JSSE环境支持的所有签名算法全量放到
CertificateRequest消息的候选列表中发给客户端,不会做安全过滤。 - 从Tomcat 8.5.30、9.0.7版本开始,Tomcat默认对客户端证书认证阶段的签名算法做了安全裁剪,会自动过滤SHA1withRSA、MD5系列等被标记为不安全的遗留签名算法,不会将这些算法下发给客户端作为候选。
报错根因
场景中使用的智能卡存储的客户端证书,基本都是企业/机构早年签发的SHA1withRSA签名证书,这类证书的签名算法不在Tomcat 9默认下发的候选算法列表里。NetID等智能卡中间件收到服务端的证书请求后,找不到和本地存储证书匹配的通用签名算法,就会直接抛出ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS错误,不会进入后续的证书选择、PIN码验证流程。
当前Connector配置只指定了TLS版本为TLSv1.2,没有显式声明客户端认证允许的签名算法列表,Tomcat 9就会直接走默认的严格过滤规则,这也是同一份配置在Tomcat 8.5.8上正常、在Tomcat 9上必现报错的核心原因。
修复方法
在现有Connector配置中新增clientAuthSigSchemes参数,显式放开业务需要的遗留签名算法即可,修改后的配置参考:
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation" maxThreads="150" scheme="https" secure="true" clientAuth="true" sslProtocol="TLSv1.2" keystoreFile="/srv/archive/Cert/archivelux.jks" keystorePass="xxxx" truststoreFile="/srv/archive/Cert/archivelux.jks" truststorePass="xxxx" truststoreType="JKS" clientAuthSigSchemes="RSA_WITH_SHA256,RSA_WITH_SHA384,RSA_WITH_SHA1,ECDSA_WITH_SHA256,ECDSA_WITH_SHA384,ECDSA_WITH_SHA1"/>
补充注意事项:
- 如果在Java 17环境下配置后仍报错,需要检查JRE目录下
conf/security/java.security文件中的jdk.certpath.disabledAlgorithms配置,将SHA1从禁用算法列表中移除。该调整仅适用于内部固定场景的业务系统,公网面向公众的服务不建议放开SHA1算法限制,存在已知安全风险。 - 不要通过开启TLS1.0、TLS1.1低版本协议的方式绕过问题,低版本TLS协议存在公开安全漏洞,无特殊需求不要启用。
内容的提问来源于stack exchange,提问作者Paul Bergström
相关产品推荐
相关产品推荐

