Tomcat 日志中的 SSL 错误处理与排查指南
一、快速定位与日志要点
二、常见错误与修复对照表
| 日志/现象 | 典型根因 | 修复要点 |
|---|---|---|
| SEVERE: Failed to initialize end point … java.io.IOException: Keystore was tampered with, or password was incorrect | 密钥库路径错误、密码错误、文件权限不足 | 核对 keystoreFile 与 keystorePass,确认文件可读;必要时用 keytool 验证密码 |
| java.security.UnrecoverableKeyException: Cannot recover key | 密钥库/密钥密码不一致 | 确保 keystorePass 与密钥密码一致(keytool 导入 PKCS#12 时尤其注意) |
| javax.net.ssl.SSLHandshakeException / no cipher suites in common | 协议/套件不匹配、JDK 版本过旧 | 在 |
| 浏览器 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 | 证书被吊销 | 申请新证书并部署 |
| 链不完整导致客户端验证失败 | 缺少中间证书 | 将中间证书导入密钥库或配置 certificateChainFile |
| 端口占用(如 8443/443) | 其他进程占用 | 释放端口或更改 Connector 端口,重启 Tomcat |
| 配置未生效 | 修改后未重启、配置被覆盖 | 彻底重启 Tomcat,检查是否被其他配置覆盖 |
三、配置与验证要点
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false">
<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"/>
</SSLHostConfig>
</Connector>
四、深入排查与工具
五、安全与运维建议