1. 准备证书文件
选项A:使用自签名证书(测试环境)
# 生成密钥库
keytool -genkeypair \
-alias tomcat \
-keyalg RSA \
-keysize 2048 \
-validity 365 \
-keystore /path/to/keystore.jks \
-storepass changeit \
-keypass changeit \
-dname "CN=localhost, OU=IT, O=Company, L=City, ST=State, C=CN"
选项B:使用CA颁发的证书
从证书提供商获取:
- domain.crt(服务器证书)
- domain.key(私钥)
- ca-bundle.crt(CA证书链)
转换为JKS格式:
# 将PEM格式合并为PKCS12
openssl pkcs12 -export \
-in domain.crt \
-inkey domain.key \
-chain \
-CAfile ca-bundle.crt \
-name "tomcat" \
-out tomcat.p12 \
-password pass:changeit
转换为JKS格式
keytool -importkeystore \
-deststorepass changeit \
-destkeypass changeit \
-destkeystore keystore.jks \
-srckeystore tomcat.p12 \
-srcstoretype PKCS12 \
-srcstorepass changeit \
-alias tomcat
## 2. 配置Tomcat server.xml
编辑 `$CATALINA_HOME/conf/server.xml`:
### 方案A:HTTP/1.1 Connector
```xml
<!-- 取消注释或添加以下配置 -->
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true"
keystoreFile="/path/to/keystore.jks"
keystorePass="changeit"
keyAlias="tomcat"
clientAuth="false"
sslProtocol="TLS"
ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_RSA_WITH_AES_256_GCM_SHA384"
>
</Connector>
方案B:HTTP/2 Connector(推荐)
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true">
<SSLHostConfig
certificateVerification="false"
protocols="TLSv1.2,TLSv1.3">
<Certificate
certificateKeystoreFile="/path/to/keystore.jks"
certificateKeystorePassword="changeit"
certificateKeystoreType="JKS"
type="RSA" />
</SSLHostConfig>
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
3. 可选:强制HTTPS访问
在 $CATALINA_HOME/webapps/ROOT/WEB-INF/web.xml 中添加:
<security-constraint>
<web-resource-collection>
<web-resource-name>Secure Content</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
4. 启动验证
# 启动Tomcat
$CATALINA_HOME/bin/startup.sh
# 验证HTTPS
curl -k https://localhost:8443/
# 或使用浏览器访问 https://your-domain:8443
5. 高级配置示例
多域名/SNI配置
<Connector port="8443" ...>
<SSLHostConfig>
<Certificate
certificateKeystoreFile="/path/to/domain1.jks"
certificateKeystorePassword="pass1"
hostName="domain1.com"/>
<Certificate
certificateKeystoreFile="/path/to/domain2.jks"
certificateKeystorePassword="pass2"
hostName="domain2.com"/>
</SSLHostConfig>
</Connector>
使用PEM格式证书(Tomcat 9+)
<SSLHostConfig>
<Certificate
certificateFile="/path/to/certificate.pem"
certificateKeyFile="/path/to/privatekey.pem"
certificateChainFile="/path/to/ca-bundle.pem"
type="RSA"/>
</SSLHostConfig>
6. 常见问题解决
端口被占用
# 检查端口占用
netstat -tlnp | grep 8443
# 或修改server.xml中的端口号
证书格式错误
# 检查JKS文件
keytool -list -keystore keystore.jks -storepass changeit
权限问题
# 确保Tomcat用户有读取权限
chmod 640 /path/to/keystore.jks
chown tomcat:tomcat /path/to/keystore.jks
7. 安全建议
密码安全:使用强密码替换默认密码
协议限制:禁用SSLv2、SSLv3,仅启用TLSv1.2+
密钥算法:使用RSA 2048位或ECDSA
证书更新:设置自动续期提醒
安全扫描:使用SSL Labs测试SSL配置
验证配置
使用以下工具验证:
# 测试SSL连接
openssl s_client -connect localhost:8443 -servername your-domain.com
# 检查证书链
keytool -printcert -sslserver your-domain.com:8443
注意事项
Tomcat 11需要Java 11或更高版本
生产环境建议使用Let's Encrypt等免费CA
配置完成后重启Tomcat生效
防火墙需开放443端口
建议配置HTTP重定向到HTTPS
这样配置后,您的Tomcat 11就支持HTTPS访问了。