使用 $ssl_protocol 记录 HTTPS 实际协商的 TLS 版本是最轻量真实的方式;需在 http 块定义含该变量的日志格式,并在启用 HTTPS 的 server 块中启用 access_log,确保 listen 443 ssl 且证书有效。

直接用 $ssl_protocol 记录并分析 HTTPS 请求实际协商的 TLS 版本,是最轻量、最真实的方式——它不看配置支持什么,只反映客户端真实用的是哪个协议。
确保日志能稳定输出 TLS 版本
必须让 Nginx 在每次成功握手后把协议写进日志。关键两步:
- 在
http块中定义含该变量的日志格式,例如:log_format tls_dist '$remote_addr [$time_local] "$request" $status $ssl_protocol "$http_user_agent"'; - 在启用 HTTPS 的
server块中启用它:access_log /var/log/nginx/tls-distribution.log tls_dist; - 确认该
server已配置listen 443 ssl且证书有效;否则$ssl_protocol恒为空
快速识别协议使用现状
日志积累后,用标准命令就能看出真实分布:
- 查看全部 TLS 版本频次(降序):
awk '{print $6}' /var/log/nginx/tls-distribution.log | sort | uniq -c | sort -nr - 筛出仍在用 TLSv1.0 或 TLSv1.1 的请求(需立即关注):
grep -E 'TLSv1\.0|TLSv1\.1' /var/log/nginx/tls-distribution.log | head -10 - 统计最近一小时 TLSv1.2 和 TLSv1.3 占比:
awk -v d="$(date -d '1 hour ago' '+%d\/%b\/%Y:%H')" '$4 ~ d {print $6}' /var/log/nginx/tls-distribution.log | grep -E 'TLSv1\.(2|3)' | sort | uniq -c
结合来源定位问题客户端
单看版本不够,要查清谁在用旧协议:
- 提取使用 TLSv1.0 的 IP 和 User-Agent:
awk '/TLSv1\.0/ {print $1, $7}' /var/log/nginx/tls-distribution.log | head -20 - 按域名汇总各协议占比(适用于多站点):
awk '/TLSv1\.2|TLSv1\.3/ {a[$7,$6]++} END {for (i in a) print i, a[i]}' /var/log/nginx/tls-distribution.log | sort - 发现某域名下 TLSv1.3 几乎为零?说明客户端兼容性差或中间设备干扰了协商
联动加固策略闭环验证
监控不是目的,而是为了推动升级和拦截:
- 若日志持续出现 TLSv1.0,可在 server 块中加限制:
if ($ssl_protocol = "TLSv1.0") { return 421; } - 检查
ssl_protocols配置是否真生效:日志里没有 TLSv1.0,但配置仍保留它,就存在风险敞口 - 对比
$ssl_cipher是否匹配你声明的ssl_ciphers,避免套件未按预期生效


















