首页/安全/取证与溯源速查/JA3/JA4 客户端指纹应用

JA3/JA4 客户端指纹应用

JA3/JA4 由 TLS Client Hello 生成:同一工具在不同 IP 上复用相同指纹,可用于把散落连接归并到一类客户端。

取证与溯源速查安全更新于 2026-10-13

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 时,指纹反映的是代理的实现;此时指纹可以用于确认“流量经过了哪个中间设备”,而不是识别终端程序。

易错点

  • 把相同指纹当作同一个人或同一组织:指纹相同只说明 TLS 实现相近,需与域名、时间、行为一起判断
  • 跨长时间窗聚合:客户端升级会造成指纹分裂或迁移,结论会随窗口选择而变化
  • 忽略中间设备:代理重签场景下指纹指向代理,直接归因终端会出错
  • 字段名照搬:不同工具版本字段命名不同,未确认就写查询会得到空结果
  • 只看指纹不看域名:同一指纹常被大量正常软件使用,必须结合访问目标与频率筛选

数据来源与参考

  • JA3 指纹方法原文(Salesforce 工程博客)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌