# Nginx SSL 配置生成器（TLS 1.2/1.3、HSTS）

> 生成安全的 Nginx HTTPS 配置：TLS 1.2 和 1.3、现代密码套件、HSTS、HTTP 跳转 HTTPS、http2，可选 X25519MLKEM768。

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

生成带 TLS 1.2/1.3、HSTS 和 HTTPS 跳转的 Nginx server 配置，并按你的 Nginx 和 OpenSSL 版本给出注意事项。

[TLS 配置生成器](https://ssl.sh/zh/tools/tls-config-generator/)的 Nginx 预设生成加固过的 Nginx HTTPS 配置。选好档位和选项，把生成的 server 块复制到站点配置里，用 `nginx -t` 测试后重载。

## 示例：中级档

```nginx
server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name example.com;

    ssl_certificate     /etc/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/example.com/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_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;
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;

    root /var/www/example.com;
}
```

## 国内环境说明

- **宝塔面板**：在“网站 → 设置 → SSL”里粘贴“密钥(KEY)”和“证书(PEM格式)”后，面板会把证书写到 `/www/server/panel/vhost/cert/<网站名>/` 下的 `fullchain.pem` 和 `privkey.pem`，并在配置文件里生成 ssl 相关指令。要改协议和套件，在“配置文件”里修改 `ssl_protocols`、`ssl_ciphers` 这几行。
- **阿里云、腾讯云下载的 Nginx 证书包**：里面的 `.pem`/`_bundle.crt` 已经是证书链，直接给 `ssl_certificate`；`.key` 给 `ssl_certificate_key`。

## 版本要求

- **TLS 1.3**：Nginx 1.13.0+，并且链接 OpenSSL 1.1.1+，用 `nginx -V` 确认。
- **`http2 on;`**：Nginx 1.25.1+。更老的版本删掉这一行，改为 `listen 443 ssl http2;`。
- **后量子**：`ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1:secp384r1;` 需要 OpenSSL 3.5+，版本不够时 Nginx 无法启动，确认后再勾选。

## 测试并重载

```bash
sudo nginx -t && sudo systemctl reload nginx
curl -sI https://example.com | grep -i strict-transport
```

然后用 [SSL 检查](https://ssl.sh/zh/tools/ssl-checker/)确认协议和证书链。

## 常见错误

- **`ssl_certificate` 只放了站点证书**：浏览器也许没事，但 curl、Java、小程序后端调用会失败。用 `fullchain.pem`（见[证书链补全](https://ssl.sh/zh/tools/chain-builder/)）。
- **在 `location` 里写了 `add_header`**：会覆盖从 server 块继承来的所有 `add_header`，HSTS 在这个 location 里悄悄消失了。在那个 location 里把 HSTS 再写一遍。
- **私钥和证书不匹配**：Nginx 报 “key values mismatch”，用[私钥匹配工具](https://ssl.sh/zh/tools/key-matcher/)检查。


## FAQ

**配置放在哪里？**

放在站点的 server 块里，一般是 /etc/nginx/conf.d/example.com.conf，或 /etc/nginx/sites-available/example.com（链接到 sites-enabled）。宝塔面板在“网站 → 设置 → 配置文件”里编辑。ssl_protocols 等也可以写在 http 块里，对所有站点生效。

**怎么知道 Nginx 用的是哪个 OpenSSL？**

执行 nginx -V，输出里有 built with OpenSSL x.y.z。TLS 1.3 需要 1.1.1+，X25519MLKEM768 需要 3.5+。CentOS 7 上用系统 OpenSSL 1.0.2 编译的 Nginx 不支持 TLS 1.3。

**要开 ssl_stapling 吗？**

只有 CA 还在提供 OCSP 时才有用。2025 年 5 月以后签发的 Let's Encrypt 证书里没有 OCSP 地址，Nginx 会记一条警告，什么也不会装订。

**为什么 ssl_prefer_server_ciphers 设成 off？**

中级档列表里的套件都足够安全，让客户端自己选，没有 AES 硬件加速的手机可以选更快的 ChaCha20-Poly1305。
