You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:45:56