Nginx TLS1.2 TLS1.3配置
配置前的准备条件
做 Nginx TLS1.2 和 TLS1.3 配置之前,你需要确认几点:
- 已经安装好 Nginx(建议至少 1.9.1 版本,因为 TLS 1.3 需要 OpenSSL 1.1.1+,Nginx 版本至少 1.13.0)。
- 拥有一个域名(比如 example.com),并且已经解析到服务器 IP。
- 获取 SSL 证书(免费可用 Let's Encrypt 或阿里云/腾讯云免费证书,后续会提到如何放置)。
- 能够登录服务器(SSH 或宝塔面板均可)。
如果你还没装 Nginx,可以用以下命令快速安装(CentOS / Ubuntu 通用):
# CentOS
sudo yum install nginx -y
# Ubuntu / Debian
sudo apt update && sudo apt install nginx -y
安装后启动 Nginx:sudo systemctl start nginx。
修改 Nginx 配置文件开启 TLS 协议
核心操作就是修改 server 块 中的 ssl_protocols 指令。
默认情况下,很多老配置只写了 TLSv1.2,我们需要加入 TLSv1.3。
首先找到你的 Nginx 配置目录(通常为 /etc/nginx/conf.d/ 或 /usr/local/nginx/conf/)。
假设你的站点配置文件是 example.com.conf,用编辑器打开:
sudo vi /etc/nginx/conf.d/example.com.conf
确保里面已经有一段监听 443 端口的 server 块,内容类似:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/privkey.pem;
# 关键行:指定支持的 TLS 版本
ssl_protocols TLSv1.2 TLSv1.3;
# 其他配置...
}
重点说明:
- 只写
TLSv1.2 TLSv1.3,不要写TLSv1或TLSv1.1,它们不安全。 TLSv1.3必须在 OpenSSL 1.1.1 以上才支持,检查 OpenSSL 版本:openssl version。- 如果你使用了宝塔面板,可以在网站设置 → SSL → TLS 协议中选择“TLSv1.2 TLSv1.3”,不用手动改文件。
保存文件后测试配置是否正确:
sudo nginx -t
如果输出 syntax is ok 和 test is successful,再重启 Nginx:
sudo systemctl reload nginx
补充 TLS 证书和密码套件建议
仅仅开启协议还不够,建议同时配置 强密码套件,让浏览器使用更安全的加密算法。
在 ssl_protocols 下面添加:
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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp384r1;
注意:如果你使用的是宝塔面板,在 SSL 配置中勾选“启用经典 TLS 套件”即可,宝塔会帮你设置合理的密码套件。
高频问题与避坑说明
问题 1:配置后网站无法访问,或者提示 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
常见原因是 OpenSSL 版本太低,不支持 TLS 1.3。
用 openssl version 查看,如果小于 1.1.1,需要升级:
# CentOS 7 可以使用 SCL 源安装新版本
sudo yum install centos-release-scl -y
sudo yum install devtoolset-9 -y
scl enable devtoolset-9 bash
# 然后编译安装 OpenSSL 并重新编译 Nginx(步骤略繁琐,建议直接换 Ubuntu 20+)
如果不想折腾,可以暂时只保留 TLSv1.2,等系统升级后再加 TLSv1.3。
问题 2:配置后 HTTP 访问正常,HTTPS 访问跳转不正常
检查 443 端口监听是否开启,以及证书路径是否正确。
使用 sudo netstat -tulpn | grep 443 确认 Nginx 在监听。
避坑 1:不要在同一个 server 块中同时写 ssl_protocols 和 ssl_ciphers 发生冲突
通常情况下写在 server 块内即可,如果多个站点共用一套配置,可以提到 http 块中设为全局。
避坑 2:不要自己乱改密码套件顺序,建议使用 Mozilla SSL Configuration Generator 生成
验证 HTTPS 是否支持 TLS 1.2 和 1.3
配置完成后,用两种方式验证:
- 浏览器直接访问:打开 Chrome 或 Edge,按 F12 → 安全 → 查看连接,应该能看到“TLS 1.3”。
- 在线检测工具:访问 SSL Labs 输入你的域名,检测评级最好达到 A 或 A+。
- 命令行快捷验证(在服务器本地或任何有 curl 的机器上):
# 检查支持的协议版本
curl --tlsv1.2 -I https://example.com # 应该成功返回
curl --tlsv1.3 -I https://example.com # 如果报错“SSL connect error”,说明 TLS 1.3 未生效
如果两条命令都返回 200 状态码,说明 Nginx TLS1.2 和 TLS1.3 配置正确。
最后,建议定期检查证书有效期,并将 ssl_protocols 更新为仅保留 TLSv1.2 TLSv1.3,禁掉更旧的协议。
遇到异常时优先回看避坑和高频问题部分,大部分情况下是 OpenSSL 版本或证书路径问题。
祝你配置顺利!