可通过$ssl_protocol变量获取实际协商的tls版本(如tlsv1.2或tlsv1.3),需配置在listen 443 ssl的server块中,配合log_format记录日志或add_header透出响应头,并确保nginx≥1.7.0、openssl支持且握手成功。

可以通过 Nginx 的内置变量 $ssl_protocol 获取当前连接所使用的 SSL/TLS 协议版本。
使用 $ssl_protocol 变量记录或响应
该变量在 HTTPS 请求处理过程中可用,值为实际协商完成的协议版本,例如 TLSv1.2 或 TLSv1.3。它仅在启用 SSL 的 server 块中有效。
- 在日志中记录:在
log_format中加入$ssl_protocol,例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$ssl_protocol"'; - 在响应头中透出(调试用):
add_header X-SSL-Protocol $ssl_protocol; - 配合 map 指令做条件判断,例如区分 TLS 版本做不同限流策略或重定向逻辑
确保变量可用的前提条件
$ssl_protocol 不是始终存在,需满足以下条件:
- 请求必须走 HTTPS(即匹配到启用了
ssl on或配置了listen 443 ssl的 server 块) - Nginx 版本需 ≥ 1.7.0(该变量自此时引入)
- OpenSSL 版本需支持对应协议(如 TLSv1.3 需 OpenSSL 1.1.1+ 且编译时启用)
- 客户端与服务端成功完成 TLS 握手,未在握手阶段中断(如证书校验失败、协议不匹配等会导致变量为空)
验证是否生效的简单方法
可在配置中临时添加响应头并用 curl 测试:
- 配置段示例:
location / {<br> add_header X-Used-TLS $ssl_protocol;<br>} - 执行:
curl -I https://your-domain.com
查看响应头中X-Used-TLS的值 - 注意:若返回空值,说明未走 HTTPS、SSL 未启用,或握手失败(可查 error.log 中 SSL 相关错误)
常见问题与注意事项
该变量反映的是实际协商结果,不是服务器配置的最低/最高版本:
- 即使配置了
ssl_protocols TLSv1.2 TLSv1.3,最终值取决于客户端支持与服务端共同支持的最高版本 - 不建议用它做安全策略兜底(如“只允许 TLSv1.3”),应通过
ssl_protocols和ssl_ciphers主动限制 - HTTP/2 连接下该变量仍有效,但协议版本仍是 TLS 层的(HTTP/2 本身不改变 TLS 版本)











