必须手动编译openssl 1.1.1w并重编译nginx:先确认当前版本与依赖路径,再下载编译新库至非系统路径,更新ldconfig,重新编译nginx指向新库,最后在ssl配置中指定tlsv1.2 tlsv1.3及对应密钥套件。

宝塔面板默认不自动启用 TLS 1.3,即使 Nginx 版本够新(如 1.15+),也必须同时满足两个硬性条件:OpenSSL 运行时库版本 ≥ 1.1.1(推荐 1.1.1w)且 Nginx 编译时链接的是该新版库;配置中显式声明 TLSv1.3 并使用兼容的密钥套件。缺一不可,否则 ssllabs 测出来仍是 TLS 1.2。
确认当前 OpenSSL 是否支持 TLS 1.3
不是看 openssl version 输出的命令行工具版本,而是看 Nginx 实际加载的运行时库:
- 执行
ldd /www/server/nginx/sbin/nginx | grep ssl,观察输出路径是否指向/usr/lib64/libssl.so.1.1或更高 —— 如果是libssl.so.1.0.2,说明底层仍为旧版,改配置无效 - 执行
/usr/local/openssl-1.1.1w/bin/openssl version -a(若已装过)对比 built on 时间,确认新库可执行 - 执行
ldconfig -p | grep ssl查看系统是否已将新库路径纳入动态链接搜索范围
Nginx 必须重编译才能真正启用 TLS 1.3
宝塔内置的 Nginx 安装包(尤其老版本或一键部署的)大概率是用系统自带 OpenSSL 1.0.2 编译的,哪怕你后来手动装了 1.1.1w,Nginx 也不会自动切换。必须重编译:
- 进入宝塔 Nginx 源码目录:
cd /www/server/nginx/src - 先备份原 configure 参数:
nginx -V 2>&1 | grep -o 'configure arguments:.*' | sed 's/configure arguments://' | xargs -n1 | grep -E '(openssl|with-http_ssl_module)' - 重新 configure,关键参数必须包含
--with-openssl=/usr/local/openssl-1.1.1w(路径需与你安装路径一致),并确保有--with-http_ssl_module - 执行
make && make install,完成后nginx -V应能看到 configure args 中明确列出 openssl 路径
站点配置中启用 TLSv1.3 的正确写法
ssl_protocols 和 ssl_ciphers 必须协同生效,顺序和内容都敏感:
-
ssl_protocols推荐写成TLSv1.2 TLSv1.3,不要加TLSv1.1或TLSv1,否则 SSL Labs 会降级评分 -
ssl_ciphers必须把 TLS 1.3 专用套件放在最前面,例如:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:EECDH+AES128:...:!MD5 - 注意:Nginx 1.15.6+ 才原生支持
TLS13-*套件名写法;低于此版本需用 patch(如 hakasenyang 的 openssl-equal-1.1.1_ciphers.patch)或改用旧式命名 - 配置修改后,必须执行
nginx -t验证语法,再systemctl restart nginx(或宝塔界面重启),不能只 reload
常见失败原因与验证要点
很多用户改完配置测不出 TLS 1.3,根本问题不在 Nginx 配置本身,而在依赖链断裂:
- 宝塔后台「网站」→「设置」→「SSL」里点「强制 HTTPS」会自动生成一段配置,但它可能覆盖你手动写的
ssl_protocols,务必检查生成的 conf 文件末尾是否被追加了冲突指令 - 多个域名共用一个 Nginx 实例时,只要有一个站点的配置没加
TLSv1.3,且该配置文件被 include 在前,就可能导致整个 server 块降级 - 验证必须用真实客户端:Chrome 110+、Firefox 112+ 访问时按 F12 → Security 标签页看 Connection 显示;
curl -I --tlsv1.3 https://yoursite.com成功返回才算真通 - 别信宝塔界面右上角“SSL 状态”,它只查证书有效性,不查协议协商能力
最易被忽略的一点:重编译 Nginx 后,如果没运行 ldconfig 刷新缓存,或者新 OpenSSL 库路径没写进 /etc/ld.so.conf.d/,Nginx 进程启动时仍会 fallback 到系统旧库 —— 此时 lsof -p $(pgrep nginx) | grep ssl 看到的还是 libssl.so.1.0.2k,一切配置都是空谈。











