服务器仅开启TLS1.2 TLS1.3安全Nginx配置
为什么必须禁用低版本 TLS
许多老旧服务器默认开启 SSLv3、TLS 1.0、TLS 1.1,但这些协议存在已知漏洞(如 POODLE、BEAST),极易被中间人攻击。
现代 Web 安全最佳实践是仅保留 TLS 1.2 和 TLS 1.3。
TLS 1.3 握手更快、加密更强,而 TLS 1.2 作为兼容性底线。
如果你在运营网站或 API 服务,服务器仅开启TLS1.2 TLS1.3安全Nginx配置 是一项必须立刻执行的操作。
操作前请确认这些条件
- 已登录服务器(SSH 或云控制台)。
- Nginx 已安装并可正常运行。
- Nginx 版本:建议 1.18.0 以上(低版本也可能支持,但推荐更新)。查看版本命令:
nginx -v - OpenSSL 版本:TLS 1.3 需要 OpenSSL 1.1.1 及以上。查看命令:
openssl version - 网站已配置 HTTPS(SSL 证书)。没有证书?可先用自签名测试,或参考本站《免费申请 Let's Encrypt 证书》教程。
一步步配置 Nginx 仅允许 TLS 1.2 和 1.3
- 找到 Nginx 配置文件
一般主配置为 /etc/nginx/nginx.conf,虚拟主机配置在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/。
使用命令打开:
sudo vi /etc/nginx/nginx.conf
- 定位 server 块
找到你网站的 server { ... } 段落。
通常在 listen 443 ssl; 之后。
- 添加 / 修改 ssl_protocols 指令
在 server 块内(一般在 ssl_certificate 行附近)写入:
ssl_protocols TLSv1.2 TLSv1.3;
注意:TLSv1.2和TLSv1.3之间用空格分隔。不要包含SSLv3、TLSv1、TLSv1.1。
- 可选:同时禁用不安全的密码套件(推荐)
紧跟在 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;
这样只有强密码套件被允许,进一步降低风险。
- 保存文件并测试配置
使用以下命令测试语法是否正确:
sudo nginx -t
若输出 syntax is ok 和 test is successful,说明配置无错。
- 重启 Nginx 使配置生效
sudo systemctl reload nginx # 或 sudo nginx -s reload
常见错误和解决办法
| 错误现象 | 可能原因 | 解决办法 |
|----------|----------|----------|
| 重启后 HTTPS 无法访问 | 填写了错误的 ssl_protocols 字符串(如多余空格或拼写错误) | 检查 nginx -t 输出,修正后重载 |
| 浏览器提示“不支持的协议” | 客户端(如旧浏览器)只支持 TLS 1.0/1.1 | 如果你的用户群体必须兼容极旧设备,可考虑保留 TLS 1.2 以上,但建议提醒用户更新浏览器 |
| nginx -t 报“unknown directive ”ssl_protocols”” | Nginx 编译时未包含 SSL 模块 | 重新编译 Nginx 并添加 --with-http_ssl_module,或安装带 SSL 的版本 |
| 重启后配置没生效 | 忘记 reload 或修改了错误的配置文件 | 确认你修改的是实际生效的配置(可执行 nginx -T 查看全量配置) |
如何验证配置生效
- 在线 SSL 检测:访问 SSL Labs 输入你的域名,检测报告中会清晰列出启用的协议,仅看到
TLS 1.2和TLS 1.3即成功。 - 命令行测试:使用 OpenSSL 客户端连接:
openssl s_client -connect yourdomain.com:443 -tls1_2 # 应成功
openssl s_client -connect yourdomain.com:443 -tls1_1 # 应失败
openssl s_client -connect yourdomain.com:443 -ssl3 # 应失败
如果失败命令输出类似 sslv3 alert handshake failure,说明低版本已被禁用。
避坑说明
- 不要直接在全局 http 块设置 ssl_protocols(除非所有 server 都想要相同配置)。但建议在各自 server 块单独设置,避免覆盖影响其他站点。
- TLS 1.3 需要 OpenSSL >= 1.1.1。如果你的 OpenSSL 版本较低,可以先升级 OpenSSL,或只开启 TLS 1.2。
- 修改配置前备份原文件:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak,方便回退。 - 如果网站有负载均衡或 CDN,需要在 Nginx 源站和 CDN 两端都做协议限制,否则 CDN 可能用低版本回源。
完成以上步骤后,你的 Nginx 服务器已经只接受 TLS 1.2 和 TLS 1.3 的安全连接,有效提升了 HTTPS 安全性。
如果你在配置过程中遇到其他问题,欢迎在评论区留言交流。