# Tomcat SSL 配置生成器（server.xml SSLHostConfig）

> 生成 Tomcat 的 HTTPS Connector 和 SSLHostConfig：TLS 1.2/1.3、密码套件、PEM 或 PFX 证书、HSTS 过滤器。

Source: https://ssl.sh/zh/tools/tls-config-generator/tomcat/
Last updated: 2026-11-10

生成 Tomcat server.xml 里带 SSLHostConfig 的 HTTPS Connector，支持 PEM 或 PFX 证书，并附上 web.xml 的 HSTS 过滤器。

[TLS 配置生成器](https://ssl.sh/zh/tools/tls-config-generator/)的 Tomcat 预设生成 `conf/server.xml` 里带 `SSLHostConfig` 的 HTTPS `Connector`，以及 `conf/web.xml` 里的 HSTS 过滤器。两段都粘贴好后重启 Tomcat。

## 示例：中级档

```xml
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig protocols="TLSv1.2+TLSv1.3"
                   ciphers="ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305"
                   honorCipherOrder="false"
                   disableSessionTickets="true">
        <Certificate certificateFile="/etc/ssl/example.com/cert.pem"
                     certificateKeyFile="/etc/ssl/example.com/privkey.pem"
                     certificateChainFile="/etc/ssl/example.com/chain.pem" />
    </SSLHostConfig>
</Connector>
```

用云厂商下载的 PFX 时：

```xml
<Certificate certificateKeystoreFile="conf/example.com.pfx"
             certificateKeystoreType="PKCS12"
             certificateKeystorePassword="密码文件里的密码" />
```

## 版本说明

- Tomcat 9.0、10.1、11 都支持这个写法（8.5 也支持，但已停止维护）。
- TLS 1.3 需要 Java 11+。Java 8u291/11.0.11 起在 `java.security` 里默认禁用了 TLS 1.0/1.1，兼容旧版档还要修改这项设置。
- Tomcat 会把 OpenSSL 风格的套件名转换给 JSSE 用，所以同一个 `ciphers` 字符串有没有 Tomcat Native 都能用。

## 重启并测试

```bash
sudo systemctl restart tomcat
openssl s_client -connect example.com:8443 -servername example.com </dev/null | head -5
```

想直接在 443 端口提供 HTTPS，可以改端口并允许 Tomcat 绑定特权端口，或者在前面放一个反向代理。

## 常见错误

- **密钥库密码或类型不对**：日志里有 “keystore password was incorrect”，`.pfx` 文件要写 `certificateKeystoreType="PKCS12"`。
- **缺证书链**：Java 客户端会报 [PKIX path building failed](https://ssl.sh/zh/errors/java-pkix-path-building-failed/)，设置 `certificateChainFile` 或者在 PFX 里带上证书链。


## FAQ

**用 PEM 文件还是 PFX 密钥库？**

Tomcat 8.5 起两种都行。PEM 方便配合 ACME 客户端自动更新；PKCS #12 把所有东西放在一个带密码的文件里，阿里云、腾讯云给 Tomcat 的下载包大多就是这种。

**还需要 JKS 吗？**

不需要。JKS 是旧格式，Java 9 起默认密钥库类型就是 PKCS #12，Tomcat 可以直接读 PKCS #12 和 PEM。云厂商下载包如果是 .jks，也可以继续用（certificateKeystoreType="JKS"）。

**Tomcat 前面有 Nginx 或负载均衡，还要配这个吗？**

如果 TLS 在代理上终止，代理通过内网 HTTP 连 Tomcat，就不用。在代理上配置 TLS，并让 Tomcat 知道原始协议（RemoteIpValve）。
