t13d1516h2_8daaf6152771_e5627efa2ab1
在浏览器本地运行,粘贴的内容不会发送到任何地方。
格式
可读:协议、版本、SNI、加密套件数、扩展数、第一个 ALPN 值。
加密套件排序后做 SHA-256,截取 12 个字符。
扩展排序(不含 SNI 和 ALPN),再按原顺序附上签名算法,以同样方式哈希。
JA3 与 JA4
| 项目 | JA3 | JA4 |
|---|---|---|
| 哈希 | 对全部字段做一次 MD5 | 可读前缀加两个短 SHA-256 哈希 |
| 扩展顺序 | 按发送顺序哈希,Chrome 打乱顺序后每次连接都会得到新的 JA3 | 先排序,顺序不影响结果 |
| 无需查表即可阅读 | 否 | 协议、版本、SNI、计数、ALPN |
| QUIC | 无标记 | 以 q 开头 |
| 许可证 | BSD 3-Clause | BSD 3-Clause(仅 JA4) |
来源
只有终止 TLS 的一方能看到 ClientHello,页面中的脚本永远看不到。
Bot Management 在规则中提供 cf.bot_management.ja4,在 Workers 中提供 request.cf.botManagement.ja4。
规则可以匹配 JA4 指纹,WAF 日志也会记录它。
任何终止 TLS 的组件都能计算 JA4,并通过 X-JA4 等请求头传递。
FoxIO 的插件为抓包结果增加 JA4 列。
Agentscan
在每次 Agentscan 检查中附上 JA4。它会与判定、地址和网络一起保存,日志可显示每个请求背后的 TLS 客户端。
curl -X POST https://ipscanner.io/v1/agentscan/check \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ip": "203.0.113.7",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
"ja4": "t13d1516h2_8daaf6152771_e5627efa2ab1"
}'常见问题
一个描述 TLS ClientHello 的短字符串:客户端提供的协议和版本、是否发送了服务器名称、列出了多少加密套件和扩展、第一个 ALPN 值,后面是这些列表的两个哈希。FoxIO 于 2023 年发布,作为 JA3 的继任者。
基于 TCP 的 TLS、1.3 版本、SNI 中带有域名、15 个加密套件、16 个扩展,第一个 ALPN 值为 HTTP/2。每个 JA4 都以这样的部分开头,这也是唯一无需查表就能读懂的部分。
JA3 是按发送顺序对握手字段做的一次 MD5。Chrome 自 2023 年起打乱扩展顺序,导致同一浏览器每次连接都得到新的 JA3。JA4 先对列表排序,因此保持稳定,并保留可读前缀。
可以。curl-impersonate、uTLS 等工具能复制浏览器的 ClientHello,因此单凭浏览器 JA4 无法证明对方是浏览器。它在与其他信号矛盾时最有用,例如 Chrome 的 User-Agent 却带着 Python 的握手。
不可以。b 和 c 部分是截断为 12 个字符的 SHA-256 哈希。要查看背后的加密套件和扩展,请记录 JA4_r,它以明文保留这些列表。
从终止 TLS 的环节获取:CDN、负载均衡器或反向代理。页面中的 JavaScript 无法读取,因为握手在任何脚本运行之前就已结束。
JA4(TLS 客户端指纹)采用 BSD 3-Clause 许可。其他 JA4+ 方法(JA4S、JA4H、JA4X、JA4T 等)采用 FoxIO License 1.1,对商业用途设有条件,将它们集成到产品前请先阅读该许可。