详细说明 Tomcat 7、8、9、10 版本之间的 SSL 配置差异,帮助您正确配置 SSL 证书
| Tomcat 版本 | Java 版本要求 | TLS 1.2 | TLS 1.3 | HTTP/2 | 状态 |
|---|---|---|---|---|---|
| Tomcat 7.x | Java 6/7 | ✅ | ❌ | ❌ | 已弃用 |
| Tomcat 8.x | Java 7/8 | ✅ | ❌ | ⚠️ 需配置 | 稳定 |
| Tomcat 9.x | Java 8+ | ✅ | ✅ | ✅ | 推荐 |
| Tomcat 10.x | Java 11+ | ✅ | ✅ | ✅ | 当前 |
Tomcat 需要使用 Java 密钥库(.jks 或 .p12)格式的证书。如果您收到的是 .crt 和 .key 文件,需要先转换为密钥库格式。
# # 合并证书链(如果需要)cat your_domain.crt intermediate_ca.crt > fullchain.crt
# # 转换为 PKCS12 格式openssl pkcs12 -export -out your_domain.p12 -inkey your_domain.key -in fullchain.crt -name tomcat
# # 系统会提示您设置密码,请妥善保管此密码
# # 从 PKCS12 转换为 JKSkeytool -importkeystore -srckeystore your_domain.p12 -srcstoretype PKCS12 -destkeystore your_domain.jks -deststoretype JKS
# # 或者直接从证书和私钥创建 JKS(需要先转换为 PKCS12)
Tomcat 的 SSL 配置在 server.xml 文件中进行,需要配置 HTTPS 连接器。
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true"
keystoreFile="/path/to/your_domain.p12"
keystorePass="your_keystore_password"
keystoreType="PKCS12"
clientAuth="false" sslProtocol="TLS" />
port:port:HTTPS 端口,默认 8443,生产环境建议使用 443keystoreFile:keystoreFile:密钥库文件路径(绝对路径)keystorePass:keystorePass:密钥库密码keystoreType:keystoreType:密钥库类型,PKCS12 或 JKSclientAuth:clientAuth:是否要求客户端证书,通常设为 false<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="/path/to/your_domain.jks"
keystorePass="password"
keystoreType="JKS"
clientAuth="false" sslProtocol="TLS" />
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true"
keystoreFile="/path/to/your_domain.p12"
keystorePass="password"
keystoreType="PKCS12"
clientAuth="false" sslProtocol="TLS" />
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true"
keystoreFile="/path/to/your_domain.p12"
keystorePass="password"
keystoreType="PKCS12"
clientAuth="false"
sslProtocol="TLS"
sslEnabledProtocols="TLSv1.2,TLSv1.3"
ciphers="TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" />
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true"
keystoreFile="/path/to/your_domain.p12"
keystorePass="password"
keystoreType="PKCS12"
clientAuth="false"
sslProtocol="TLS"
sslEnabledProtocols="TLSv1.2,TLSv1.3"
ciphers="TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" />
# # 查看 PKCS12 密钥库keytool -list -v -keystore your_domain.p12 -storetype PKCS12
# # 查看 JKS 密钥库keytool -list -v -keystore your_domain.jks
# # 修改 PKCS12 密钥库密码keytool -storepasswd -keystore your_domain.p12 -storetype PKCS12
# # 修改 JKS 密钥库密码keytool -storepasswd -keystore your_domain.jks
# # 导入中间证书到 PKCS12keytool -import -trustcacerts -alias intermediate -file intermediate.crt -keystore your_domain.p12 -storetype PKCS12
# # 导入中间证书到 JKSkeytool -import -trustcacerts -alias intermediate -file intermediate.crt -keystore your_domain.jks
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
sslEnabledProtocols="TLSv1.2,TLSv1.3"
sslProtocol="TLS"
... />
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
sslEnabledProtocols="TLSv1.2,TLSv1.3"
sslProtocol="TLS"
... />
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true"
keystoreFile="/etc/tomcat/ssl/your_domain.p12"
keystorePass="${catalina.base}/conf/keystore.pass"
keystoreType="PKCS12"
clientAuth="false"
sslProtocol="TLS"
sslEnabledProtocols="TLSv1.2,TLSv1.3"
ciphers="TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"
maxHttpHeaderSize="8192" />
错误: 错误信息:java.io.IOException: keystore was tampered with, or password was incorrect
解决方案:
错误: 错误信息:Address already in use
解决方案:
错误: 错误信息:javax.net.ssl.SSLHandshakeException
解决方案:
解决方案: 问题:从 Tomcat 9 升级到 Tomcat 10 后应用无法运行
解决方案: