JA3 与 JA4 是什么
JA3 从客户端 TLS 握手的 Client Hello 中提取版本、加密套件列表、扩展列表、椭圆曲线与曲线点格式,拼串后取摘要形成指纹;JA3S 描述服务端响应。同一工具在不同 IP、不同时间上复用时通常给出相同指纹,因此可以把散落的连接归并到一类客户端,这是它在溯源中的主要价值。JA4 是在此基础上的改进方案,改用可读的分段形式表达版本、ALPN 等特征,便于人工判读与规则化。指纹反映的是 TLS 实现特征,代理与网关重签握手时会指向中间设备而非终端。
基本信息
| 适用平台 | 具备 Zeek、Suricata 或抓包能力的网络分析环境 |
|---|---|
| 数据来源 | Zeek 的 ssl.log(ja3/ja3s 字段)、Suricata 的 eve.json(tls 事件)、PCAP 离线计算 |
| 核心思路 | 按指纹聚合连接,把相同实现的客户端归为一类 |
| 字段名注意 | 不同工具与版本对 JA3/JA4 的字段命名不同,先确认再写查询 |
| 可比性前提 | 比对要限定时间窗,客户端升级会改变指纹 |
典型使用场景
- 把来自多个 IP 的同类连接归并,识别同一工具的活动
- 发现非浏览器指纹访问常见业务端口,提示自动化或恶意程序
- 与已知样本的指纹清单比对,辅助判断客户端程序家族
- 从海量 TLS 连接中筛出少数异常指纹,缩小分析范围
- 为封禁与检测规则提供可量化的特征依据
Zeek 侧聚合
Zeek 侧聚合
# 按 JA3 指纹聚合,看出现次数最多的客户端实现
zeek-cut ja3 id.orig_h id.resp_h server_name < ssl.log | sort | uniq -c | sort -rn | head
# 只看指纹维度,统计分布
zeek-cut ja3 < ssl.log | sort | uniq -c | sort -rn | head -20
# 找出某指纹对应的全部源地址(判断影响面)
zeek-cut ja3 id.orig_h < ssl.log | awk '$1=="<目标指纹>"{print $2}' | sort -u | head -20
# 与域名关联:同一指纹访问了哪些域名
zeek-cut ja3 server_name < ssl.log | sort | uniq -c | sort -rn | head -20指纹要素读法
| 要素 | 含义 | 判读要点 |
|---|---|---|
| TLS 版本 | 客户端支持的最高版本 | 异常低的版本常来自老旧工具或定制程序 |
| 加密套件列表 | 客户端偏好的套件顺序 | 顺序具有实现特征,可区分不同库 |
| 扩展列表 | 支持的扩展及顺序 | 自动化工具通常扩展较少 |
| 椭圆曲线与点格式 | 密钥交换参数 | 与套件共同构成稳定的实现特征 |
| ALPN(JA4 分段) | 协商的应用协议 | 可直接看出是 HTTP/2 还是普通 HTTP |
浏览器与常用库升级会改变指纹,跨月比对前先核对时间范围;把较长时间段整体聚合会把升级前后混在一起。
企业代理或网关重签 TLS 时,指纹反映的是代理的实现;此时指纹可以用于确认“流量经过了哪个中间设备”,而不是识别终端程序。