最轻量、最实时的HTTPS加密套件审计方式是在Nginx日志中记录$ssl_cipher变量,通过自定义log_format和access_log启用,结合shell命令筛查RC4、MD5、SHA1等高风险套件,并与ssl_ciphers配置比对验证实际生效情况。

直接在 Nginx 日志中记录 $ssl_cipher,是最轻量、最真实反映生产环境实际加密强度的方式。它不依赖扫描器,也不干扰业务,每条 HTTPS 请求都会留下客户端最终协商使用的具体套件——这才是审计弱连接的起点。
启用日志记录:让每个连接“自报家门”
只需两步,就能让 Nginx 主动输出加密套件信息:
- 在
http块中定义带$ssl_cipher的日志格式,例如:log_format cipher_audit '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_user_agent" $ssl_protocol/$ssl_cipher'; - 将该格式应用到你的
access_log指令中,如:access_log /var/log/nginx/cipher-audit.log cipher_audit; - 执行
nginx -t && nginx -s reload生效
之后每条 HTTPS 日志末尾都会追加类似 TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 或 TLSv1.0/RC4-SHA 这样的字段,真实、不可伪造。
识别弱连接:聚焦几类高风险标识
从日志中快速筛出问题连接,重点盯住以下关键词:
-
已淘汰算法:出现在套件名称中的
RC4、DES、3DES、MD5、SHA1、EXPORT、NULL -
老旧协议:
SSLv3、TLSv1.0、TLSv1.1(对应日志中$ssl_protocol字段) -
缺失前向保密:套件不含
ECDHE或DHE,例如RSA-AES128-SHA -
非 AEAD 模式:含
CBC且未搭配强哈希(如CBC-SHA1)
一条命令即可汇总高频风险项:awk '{print }' /var/log/nginx/cipher-audit.log | grep -E '(RC4|MD5|SHA1|DES|3DES|SSLv3|TLSv1\.[01]|RSA-AES|CBC.*SHA1)' | sort | uniq -c | sort -nr
定位与归因:区分是客户端限制还是配置疏漏
发现弱连接后,不能只删日志,要查清来源:
- 结合
$remote_addr和$http_user_agent判断类型:是 Windows XP IE6、旧版 Android WebView、嵌入式设备,还是扫描器或爬虫 - 若某 IP 段集中出现 TLSv1.0,可能是客户端不支持 SNI 导致服务端被动降级
- 检查该连接是否真在你当前生效的
ssl_ciphers配置范围内——如果日志里出现了ECDHE-RSA-CHACHA20-POLY1305,但配置中没写它,说明配置未加载或被覆盖
逐步淘汰:从拦截到加固的闭环动作
淘汰不是一刀切,而是分阶段推进:
- 第一阶段(观测期):仅记录、告警,不阻断;用 ELK 或 Loki 建立仪表盘,统计弱连接占比与趋势
-
第二阶段(提示期):对 TLSv1.0/1.1 连接返回
426 Upgrade Required,并在响应头中添加说明 -
第三阶段(拦截期):在 server 块中加入:
if ($ssl_protocol ~ "^TLSv1\.0|TLSv1\.1$") { return 426; } -
同步加固配置:显式禁用弱算法,例如:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_protocols TLSv1.2 TLSv1.3;
每次调整后,用 nmap --script ssl-enum-ciphers -p 443 your-domain.com 验证输出中是否已无 RC4、SHA1 等关键词,确保策略真正落地。











