Nginx 支持 TLS 1.3 的前提是 nginx ≥ 1.13.0(推荐 ≥ 1.14.0)且编译时链接的 OpenSSL ≥ 1.1.1;仅修改 ssl_protocols TLSv1.3 而不满足底层版本要求将静默失效,导致连接降级或失败。

直接说结论:Nginx 支持 TLS 1.3 的前提是 nginx ≥ 1.13.0(推荐 ≥ 1.14.0)且编译时链接的 OpenSSL ≥ 1.1.1。只改配置不升级底层,ssl_protocols TLSv1.3 这行会静默失效——浏览器连不上,或者降级到 TLS 1.2,你自己都察觉不到。
确认 Nginx 和 OpenSSL 实际运行版本
很多人卡在这一步,以为装了新包就万事大吉,其实 nginx -v 只显示 nginx 版本,nginx -V(大写 V)才显示编译参数和 OpenSSL 版本。必须执行:
nginx -V 2>&1 | grep -i "openssl\|built with"
输出中要同时看到类似:
nginx version: nginx/1.14.1built with OpenSSL 1.1.1f 31 Mar 2020
如果 OpenSSL 显示的是 1.0.2 或 1.1.0,哪怕 nginx 是 1.18,TLS 1.3 也完全不可用。Ubuntu/Debian 用户别信默认源,得加 ppa:ondrej/nginx;CentOS/RHEL 用户得换 EPEL + 手动编译或用 nginx-mainline 仓库。
nginx.conf 中 ssl_protocols 必须显式包含 TLSv1.3
旧配置常写成 ssl_protocols TLSv1.2 TLSv1.3;,这没问题;但如果你沿用了历史配置,比如只写了 TLSv1.1 TLSv1.2,那 TLS 1.3 就不会启用——它不会自动追加,也不会报错。
正确写法(推荐):
ssl_protocols TLSv1.2 TLSv1.3;
注意点:
- 不要写
TLSv1或TLSv1.1,它们已淘汰,留着反而增加攻击面 - 顺序无关,但建议把 TLSv1.3 放后面,避免某些老旧客户端误判
- 该指令必须出现在
server块内(443 端口),不能只放在 http 块顶层
证书和密钥本身不影响 TLS 1.3 启用,但 OCSP Stapling 要配对
TLS 1.3 不依赖证书签名算法(RSA/ECC 都行),也不强制要求 ECDSA 证书。你现有的 Let’s Encrypt RSA 证书、自签证书、甚至 openssl req -x509 生成的都能用。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
但一个容易被忽略的配套项是 OCSP Stapling:TLS 1.3 下浏览器更倾向验证证书状态,若没开启 stapling,部分客户端(尤其是 Safari 和 iOS)可能延迟建立连接,甚至触发证书警告。
确保配置里有:
ssl_stapling on;<br>ssl_stapling_verify on;<br>ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
然后测试 stapling 是否生效:
openssl s_client -connect example.com:443 -status -servername example.com 2>&1 | grep -i "OCSP response"
没输出或显示 no response sent,说明 stapling 没跑通,得检查 DNS 解析、防火墙、以及 ssl_trusted_certificate 路径是否指向包含根证书的 fullchain。
重启后必须用真实终端验证,别信 curl 或在线工具
curl -I https://example.com 默认不显示 TLS 版本;openssl s_client -connect 虽然能看,但默认用 TLS 1.2 协议发起连接,除非加 -tls1_3 参数。
最可靠的方式是用 Chrome 或 Firefox 访问,打开开发者工具 → Security 标签页,看 “Connection” 行是否明确写着 TLS 1.3。如果显示 TLS 1.2,即使配置全对,也大概率是 OpenSSL 版本没真正更新——系统里可能有多个 OpenSSL,Nginx 编译时链接的是旧的那个,而命令行调用的是新的。
复杂点在于:有些发行版(如 Ubuntu 20.04)自带的 libssl1.1 包虽然版本号是 1.1.1,但打了 TLS 1.3 disable 补丁;有些容器镜像(如旧版 nginx:alpine)用的是 LibreSSL,根本不支持 TLS 1.3。这些坑不会报错,只会让你白忙活半天。

















