使用$ssl_protocol记录日志可准确审计客户端真实TLS版本分布,通过Nginx日志格式配置、awk统计与User-Agent/IP关联分析,实现版本分布监控、问题定位及降级排查。

直接用 $ssl_protocol 记录并分析日志,是审计线上客户端真实 TLS 版本分布最简单、最可靠的方式——它不看配置是否“写了”,只看实际连上来的协议是什么。
一、先让日志稳定输出 TLS 版本
在 Nginx 的 http 块中定义一条含该变量的日志格式,例如:
再在启用 HTTPS 的 server 块中启用它:
确保该 server 已配置 listen 443 ssl 和有效证书。重载配置后,每条 HTTPS 请求日志第 6 字段就是实际协商出的协议,如 TLSv1.3、TLSv1.2,明文请求或握手失败则为空或 -。
二、快速统计各版本使用占比
日志积累几小时后,用以下命令即可看到真实分布:
- 查看全部 TLS 版本频次(按降序):
awk '{print $6}' /var/log/nginx/tls-distribution.log | sort | uniq -c | sort -nr - 只统计最近一小时的 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 或 TLSv1.1 的请求行:
grep -E 'TLSv1\.0|TLSv1\.1' /var/log/nginx/tls-distribution.log | head -10
三、结合上下文定位问题来源
单看版本不够,要闭环处理,需关联其他字段:
- 对某版本(如 TLSv1.0)提取高频 User-Agent:
grep 'TLSv1\.0' /var/log/nginx/tls-distribution.log | awk -F'"' '{print $6}' | sort | uniq -c | sort -nr | head -5 - 查对应 IP 的请求频率和时间分布,判断是扫描器还是真实用户:
grep 'TLSv1\.0' /var/log/nginx/tls-distribution.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5 - 若发现大量 TLSv1.0 但配置已禁用,说明存在中间设备降级或客户端绕过 SNI(常见于 WinXP IE6/7),需检查网络链路或升级终端。
四、日常监控建议
把统计逻辑写成脚本,每天定时运行并邮件告警更实用:
- 当 TLSv1.0 占比超过 0.1%,触发告警;
- 当 TLSv1.3 使用率连续 3 天低于 30%,提示客户端兼容性可能受限;
- 配合
$ssl_cipher一起记录,可进一步验证是否真用上了强套件(比如 TLSv1.3 + AES-GCM)。


















