nginx平滑升级tls需分三阶段:先确认openssl≥1.1.1(通过nginx -v和openssl version双校验),再设ssl_protocols tlsv1.2 tlsv1.3观察流量,评估达标后切为tlsv1.3并严格使用tls_aes_*专用cipher套件。

确认底层依赖是否就绪
TLS 1.3 不是配置开关,它依赖运行时 OpenSSL ≥ 1.1.1。仅靠编译时指定 --with-openssl 不够,必须检查实际加载的 OpenSSL 版本:
- 执行
nginx -V查看 built with OpenSSL 后面的版本号 - 再运行
openssl version确认系统默认 OpenSSL 是否 ≥ 1.1.1(如 1.1.1w 或 3.0.x) - 若不匹配,需升级系统 OpenSSL 或静态编译链接新版 OpenSSL
分阶段调整 ssl_protocols
直接设为 ssl_protocols TLSv1.3; 可能导致部分客户端(如旧 Android、IE11、某些嵌入式设备)连接失败。推荐三步走:
-
观察期:先设为
ssl_protocols TLSv1.2 TLSv1.3;,启用日志记录 TLS 协议版本(用$ssl_protocol变量),持续采集 3–7 天真实流量占比 - 评估期:分析日志,确认 TLS 1.2 流量已低于 5%(或业务可接受阈值),且无关键业务方投诉
-
切换期:改为
ssl_protocols TLSv1.3;,并同步更新ssl_ciphers为 TLS 1.3 专用套件(如TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384)
避免 cipher 配置陷阱
TLS 1.3 的 cipher 套件与 TLS 1.2 完全不兼容,混用会导致协商失败。务必注意:
- 不要把 TLS 1.2 的
ECDHE-ECDSA-AES256-GCM-SHA384类套件和 TLS 1.3 的TLS_AES_256_GCM_SHA384写在同一行 - 建议分开配置:
ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384;(仅 TLS 1.3) - 若需兼容 TLS 1.2,用
ssl_ciphers+ssl_prefer_server_ciphers on;控制优先级,但更推荐分环境或分 server 块隔离
配合平滑重启验证效果
配置变更后,不用 reload 全量重启,用信号机制验证新旧连接共存:
- 执行
nginx -t确认语法正确 - 发送
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)启动新 master 进程 - 再发
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid)让旧 worker 逐步退出 - 用
curl -I --tlsv1.3 https://your-site.com和--tlsv1.2分别测试,确认响应头中Alt-Svc或证书协商行为符合预期











