应使用 $ssl_cipher 变量配合 map 模块识别弱加密套件,通过 log_format 记录 $ssl_protocol、$ssl_cipher 和 $cipher_strength,实现对老旧算法请求的日志监控与分类分析。

要在访问日志中记录并监控使用老旧弱加密算法的请求,核心是通过 Nginx 的 $ssl_cipher_export 变量(实际应为 $ssl_cipher 或更准确的 $ssl_ciphers 衍生判断)识别不安全套件,并将其写入日志供后续分析。但需注意:Nginx 官方并无 $ssl_cipher_export 这个内置变量,这可能是对 $ssl_cipher 的误写或混淆——真正可用的是 $ssl_cipher(当前连接实际协商使用的加密套件名称),配合自定义 map 映射可实现弱算法识别。
确认并启用 SSL 相关日志变量
Nginx 默认不记录 TLS 握手细节,需在 log_format 中显式加入 $ssl_protocol 和 $ssl_cipher:
-
$ssl_protocol:显示 TLS 版本(如 TLSv1.2、TLSv1.3),可用于识别已废弃协议(如 SSLv3、TLSv1.0) -
$ssl_cipher:显示客户端与服务端最终协商的加密套件(如ECDHE-RSA-AES256-SHA),是识别弱算法的关键字段 - 确保 server 块启用了 HTTPS,且配置了有效的证书和
ssl_protocols/ssl_ciphers
用 map 模块标记弱加密套件
直接在日志中输出所有套件名不利于快速筛选,推荐用 map 将高风险套件映射为标记(如 weak、legacy):
map $ssl_cipher $cipher_strength {
default strong;
~*(EXPORT|DES|RC4|MD5|SHA1) weak;
~*(ADH|EDH|NULL|ANON) insecure;
~*AES128.*GCM.* strong;
~*CHACHA20.* strong;
}
说明:
- 正则匹配常见弱特征:
EXPORT(出口级弱密钥)、DES/RC4(已破解算法)、MD5/SHA1(签名不安全)、ADH/ANON(无认证密钥交换) - 明确放行现代套件(如 AES128-GCM、CHACHA20),避免误判
- 该 map 需置于 http 块顶层,早于 log_format 引用
定义含安全标识的日志格式并应用
在 log_format 中加入 $cipher_strength 和原始套件信息,便于分类统计:
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_user_agent" "$http_referer" '
'$ssl_protocol "$ssl_cipher" $cipher_strength;
然后在 server 或 location 中启用:
access_log /var/log/nginx/access-security.log security;
这样每条日志末尾会追加类似 TLSv1.2 "ECDHE-RSA-RC4-SHA" weak,方便用 grep、awk 或 ELK 快速提取弱算法请求。
配套推进安全降级的实用建议
日志只是观测手段,真正降级需结合策略落地:
- 定期导出
weak或insecure请求,按客户端 IP、User-Agent、时间段统计,识别存量旧设备或爬虫 - 对高频弱套件来源,可临时返回 426 Upgrade Required 或重定向到提示页,引导升级客户端
- 在测试环境先收紧
ssl_ciphers(如移除RC4、SHA1套件),验证业务兼容性后再上线 - 将
$cipher_strength接入 Prometheus(通过 nginx-vts-exporter 或自定义 metrics),设置告警阈值(如 weak 请求占比超 0.5%)











