在 Nginx 日志中记录 $ssl_cipher 是审计生产环境加密算法实际使用分布最轻量、最真实的方式,通过自定义日志格式(如 '$remote_addr [$time_local] "$request" $status $ssl_protocol/$ssl_cipher "$http_user_agent"')、在 HTTPS server 块启用 access_log,并用 awk 等命令统计分布,可精准识别真实使用的 TLS 版本与套件,辅助兼容性分析和配置验证。

直接在 Nginx 日志中记录 $ssl_cipher 是审计生产环境加密算法实际使用分布最轻量、最真实的方式。它不依赖扫描工具,也不干扰业务,每条 HTTPS 请求都会留下协商结果,帮你看清哪些套件被真实用到、哪些旧客户端还在拖后腿。
配置含 $ssl_cipher 的自定义日志格式
在 nginx.conf 的 http 块中定义一条新日志格式,明确包含协议版本和实际协商套件:
- 用
$ssl_protocol/$ssl_cipher组合,例如TLSv1.3/TLS_AES_256_GCM_SHA384或TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 - 避免使用
$ssl_ciphers(复数),它记录的是客户端支持的全部套件列表,过长且易截断,对兼容性分析无直接价值 - 示例配置:
log_format cipher_dist '$remote_addr [$time_local] "$request" $status $ssl_protocol/$ssl_cipher "$http_user_agent"';
在 HTTPS server 块中启用该日志
确保只在启用了 SSL 的 server 块中引用该格式,HTTP 块中无需也不应启用:
- 添加
access_log /var/log/nginx/cipher-distribution.log cipher_dist; - 确认该
server块已配置listen 443 ssl及有效证书 - 重载 Nginx(
nginx -s reload)后,日志即开始积累真实握手数据
用 shell 快速统计套件与协议分布
日志积累一段时间后,运行以下命令可直观看出各加密套件和 TLS 版本的使用占比:
- 按套件名统计频次:
awk '{print $6}' /var/log/nginx/cipher-distribution.log | sort | uniq -c | sort -nr | head -20 - 单独看 TLS 版本分布:
awk -F'[/ ]' '{print $6}' /var/log/nginx/cipher-distribution.log | sort | uniq -c | sort -nr - 聚焦老旧协议(如 TLSv1.0、TLSv1.1)对应的具体套件:
grep -E 'TLSv1\.[01]/' /var/log/nginx/cipher-distribution.log | awk '{print $6}' | sort | uniq -c | sort -nr
结合 ssl_ciphers 配置做兼容性归因
统计结果若出现未在 ssl_ciphers 中声明的套件,说明配置未生效,需检查:
-
ssl_protocols是否禁用了对应 TLS 版本(如写了ssl_protocols TLSv1.2 TLSv1.3,却在日志里看到TLSv1.0,说明客户端绕过了限制) -
ssl_prefer_server_ciphers off(默认值)时,客户端优先级更高,可能选中服务端虽支持但未显式列出的套件 - OpenSSL 版本是否足够新(≥1.1.1 推荐),否则无法协商 TLSv1.3 套件,即使配置了也无效











