Tomcat 日志中的 SSL 错误排查与修复
一、快速定位与通用修复
二、常见错误与对应处理
| 错误现象或日志关键词 | 可能原因 | 处理要点 |
|---|---|---|
| java.io.IOException: Keystore was tampered with, or password was incorrect | 密钥库路径错误、密码错误、权限不足 | 核对 keystoreFile 路径与读取权限;确认 keystorePass 正确;必要时重置密码并同步配置 |
| unable to find valid certification path to requested target | 客户端(或 Java 应用)不信任服务器证书链 | 将服务器证书或中间证书导入客户端 JRE cacerts;或配置自定义信任库 -Djavax.net.ssl.trustStore |
| 证书过期 / NET::ERR_CERT_DATE_INVALID | 证书已过期或未生效 | 重新申请并部署新证书,注意生效时间窗口 |
| 域名不匹配 / NET::ERR_CERT_COMMON_NAME_INVALID | 访问域名不在 CN/SAN 中 | 申请包含正确域名的证书(含必要 SAN 条目) |
| 颁发机构不受信任 / NET::ERR_CERT_AUTHORITY_INVALID | 使用自签名或不受信任 CA | 更换为受信任 CA 签发的证书 |
| 证书被吊销 / NET::ERR_CERT_REVOKED | 证书被 CRL/OCSP 吊销 | 重新申请并部署有效证书 |
| 协议或套件不兼容 | 仅启用旧协议/弱套件 | 启用 TLSv1.2/TLSv1.3,配置强套件(如 ECDHE+AES-GCM) |
| 证书链不完整 | 缺少中间证书 | 将中间证书与服务器证书合并导入,或使用支持链的配置方式 |
| 端口冲突(如 443/8443 被占用) | 其他进程占用端口 | 释放端口或调整 Tomcat 端口,并重启服务 |
三、server.xml 配置示例
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/keystore.jks"
certificateKeystorePassword="changeit"
type="RSA"/>
<Protocols>TLSv1.2,TLSv1.3</Protocols>
<Cipher>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</Cipher>
</SSLHostConfig>
</Connector>
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true">
<SSLHostConfig>
<Certificate certificateFile="conf/cert.pem"
certificateKeyFile="conf/key.pem"
certificateChainFile="conf/chain.pem"
type="RSA"/>
<Protocols>TLSv1.2,TLSv1.3</Protocols>
<Cipher>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</Cipher>
</SSLHostConfig>
</Connector>
四、验证与工具
五、仍无法解决时的建议