JA3和JA4是用来识别网络中SSL/TLS客户端的“指纹”技术。它们通过分析客户端发起TLS连接时发送的“Client Hello”包中的信息,生成一个独特的标识,帮助安全人员识别和区分不同的客户端设备或程序。
什么是JA3指纹?
-
定义:JA3通过提取TLS握手中Client Hello包里的关键字段(TLS版本、支持的加密套件、扩展、椭圆曲线等),将这些字段按顺序拼接成字符串,然后用MD5算法生成一个32位的哈希值,这个值就是JA3指纹。
-
作用:它可以唯一标识一个客户端的TLS连接特征,帮助发现恶意软件或异常流量。
-
示例:
- Client Hello字段示意:
TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats - 拼接字符串示例:
771,4865-4866-4867,0-11-10,23-24,0 - MD5哈希后得到的JA3指纹:
ab3e1f...
- Client Hello字段示意:
什么是JA4指纹?
-
定义:JA4是JA3的升级版,除了TLS Client Hello包,还支持HTTP、SSH等协议的指纹识别。它通过对Client Hello中的扩展和加密套件进行排序,减少了因顺序不同导致的指纹差异,使指纹更稳定。
-
特点:
- 指纹是人类可读的字符串,格式为
a_b_c,每部分代表不同协议相关信息,方便分析和扩展。 - 抗伪造能力更强,不容易被攻击者通过修改顺序绕过。
- 支持更多协议,信息更丰富。
- 指纹是人类可读的字符串,格式为
-
示例:
- JA4指纹示例:
TLS1.3_d_23-24-25_0-11-10 - 可以只看某一部分,如
JA4H_c专注HTTP Cookie字符串分析。
- JA4指纹示例:
JA3和JA4的主要区别
| 特性 | JA3 | JA4 |
|---|---|---|
| 关注点 | 仅TLS Client Hello | TLS、HTTP、SSH等多协议 |
| 指纹格式 | MD5哈希(不可读) | 人类可读的模块化字符串 |
| 协议上下文 | 单一TLS | 多协议支持 |
| 抗伪造能力 | 较低,易被自定义TLS堆栈绕过 | 较高,排序减少伪造可能 |
| 碰撞风险 | 较高,不同客户端可能相同 | 较低,更细粒度识别 |
| 可扩展性 | 静态,不易适应变化 | 模块化设计,易于扩展 |
| 应用范围 | 被动检测,IOC匹配 | 威胁狩猎、行为分析、异常检测 |
JA3/JA4的应用场景
- 阻断恶意流量
通过识别攻击者的JA3/JA4指纹,创建自定义规则阻断或挑战这些请求,防止攻击未被传统防御发现。 - 允许合法流量
识别合法移动应用的指纹,允许其流量通过,减少误报。 - 行为分析和威胁狩猎
利用JA4更丰富的指纹信息,分析异常行为和潜在威胁。 - 日志和安全分析
在日志、GraphQL API和安全事件中使用指纹数据,提升检测准确率。
JA3/JA4指纹的典型数据结构示例
{
"ja4Signals": {
"h2h3_ratio_1h": 0.988, // HTTP/2和HTTP/3请求比例
"heuristic_ratio_1h": 0.00007, // 启发式检测比例
"reqs_quantile_1h": 0.999, // 请求数量分位数
"uas_rank_1h": 901, // 不同User Agent数量排名
"browser_ratio_1h": 0.936, // 浏览器请求比例
"paths_rank_1h": 655, // 唯一路径数量排名
"reqs_rank_1h": 850, // 请求数量排名
"cache_ratio_1h": 0.189, // 缓存命中率
"ips_rank_1h": 662, // 唯一IP数量排名
"ips_quantile_1h": 0.999 // 唯一IP数量分位数
},
"jaSignalsParsed": {
"ratios": {
"h2h3_ratio_1h": 0.988,
"heuristic_ratio_1h": 0.00007,
"browser_ratio_1h": 0.936,
"cache_ratio_1h": 0.189
},
"ranks": {
"uas_rank_1h": 901,
"paths_rank_1h": 655,
"reqs_rank_1h": 850,
"ips_rank_1h": 662
},
"quantiles": {
"reqs_quantile_1h": 0.999,
"ips_quantile_1h": 0.999
}
}
}
简单的Cloudflare Workers示例:获取JA4指纹信息
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
// 从请求上下文中获取JA4指纹和信号
const ja4 = request.cf && request.cf.ja4Fingerprint || null;
const ja4Signals = request.cf && request.cf.ja4Signals || {};
// 处理缺失情况
if (!ja4) {
return new Response('没有检测到JA4指纹', { status: 200 });
}
// 返回指纹和部分信号信息
return new Response(JSON.stringify({
ja4Fingerprint: ja4,
h2h3_ratio_1h: ja4Signals.h2h3_ratio_1h || '无数据',
browser_ratio_1h: ja4Signals.browser_ratio_1h || '无数据'
}, null, 2), {
headers: { 'Content-Type': 'application/json' }
});
}
总结
- JA3和JA4都是TLS客户端指纹技术,用于识别访问服务的客户端。
- JA4是JA3的升级版,支持更多协议,指纹更稳定且易读。
- 它们在安全防护、流量分析、恶意行为检测中非常实用。
- 通过合理使用JA3/JA4指纹,可以精准阻断攻击流量,减少误报,提高安全防御能力。
以上内容帮助你快速理解JA3和JA4指纹的基础知识、区别及应用,并通过示例代码展示了如何在实际中获取和使用这些指纹,方便中国开发者和安全人员更好地掌握这一技术。