TLS指纹识别是什么?JA3与JA4解析
Specialist in Anti-Bot Strategies
TL;DR:
- TLS指纹识别通过TLS握手识别客户端软件,在发送HTTP之前的第一个字节。 服务器读取
ClientHello— 客户端提供的TLS版本、密码套件和扩展 — 并生成一个哈希,表明“这是Chrome”或“这是一个Python脚本”。 - JA3是最初的方法;JA4是它的现代替代品。 JA3(来自Salesforce)按顺序哈希原始
ClientHello字段,因此,当Chrome开始随机化其TLS扩展顺序时,JA3哈希变得不稳定。JA4首先对密码和扩展进行排序,因此指纹保持稳定。 - JA4是人类可读的,而不是单一的不透明哈希。 它的
a_b_c格式在前面编码TLS版本、SNI存在、密码和扩展计数,以及ALPN,然后哈希已排序的密码和扩展列表 — 因此您可以匹配其部分内容,而不仅仅是整体。 - 定制的HTTP客户端具有非浏览器指纹。
requests、curl或修补库发送的密码/扩展集合与真实的Chrome不同,因此其JA4即使在干净的IP后也会突出显示。 - 真实浏览器是可靠的答案。 Scrapeless Scraping Browser是真正的Chromium,因此其
ClientHello— 因此其JA3/JA4 — 与普通访客的完全无差异。 - 免费开始。 新的Scrapeless账户包括免费的Scraping Browser运行时 — 请在app.scrapeless.com注册。
引言:握手在HTTP之前揭示了你
TLS指纹识别通过连接打开TLS会话的方式识别背后的软件,而不是它之后发送的任何内容。每个HTTPS连接以ClientHello消息开始,客户端在其中宣传其支持的TLS版本、首选的密码套件和扩展列表。这些选择在真实的Chrome、Go程序和Python脚本之间存在差异,服务器可以将其哈希为一个紧凑的标识符,即使IP、用户代理和Cookie看起来完全正常,它仍然有效。
这就是为什么抓取程序可以轮换住家代理,伪装成Chrome用户代理,仍然被阻止的原因:它发送的TLS 1.3握手从一开始就从未表现得像Chrome。 本指南解释了什么是TLS指纹,JA3和JA4是如何计算指纹的,以及运行真实浏览器是呈现所属指纹的持久方法。
TLS指纹的构建基础
TLS指纹是ClientHello字段的哈希,这是客户端在打开TLS连接时发送的第一条消息。输入是客户端的TLS库和配置的稳定属性:
- 提供的TLS版本(例如,TLS 1.2或1.3)。
- 客户端支持的密码套件,按列出的顺序。
- 客户端包含的扩展(SNI、ALPN、支持的组、签名算法等)。
- 它广告的椭圆曲线和点格式。
浏览器的TLS栈产生这些值的特定、一致的组合;而脚本库产生的是不同的组合。因为指纹是从传输层派生的,因此与头部和Cookie无关 — 更改用户代理对它没有影响。
JA3:最初的TLS指纹,以及它为何失效
JA3是第一种广泛采用的TLS指纹,由Salesforce的工程师在2017年发布。它按出现的顺序连接五个ClientHello字段 — TLS版本、密码套件、扩展、椭圆曲线和椭圆曲线点格式 — 然后对该字符串取MD5,忽略TLS规范保留的GREASE值。
依赖顺序成为JA3的弱点。在2023年,Chrome开始在每个连接中随机化其TLS扩展的顺序,因此同一Chrome安装从一个请求到另一个请求生成了不同的JA3哈希。每次连接都更改的指纹对于识别客户端是无用的,因此检测供应商需要一种不依赖于排序的方法。
JA4:现代且稳定的替代品
JA4是**JA4+**中的TLS客户端指纹,这是一套由FoxIO的John Althouse创建的网络指纹识别方法。它的定义步骤是在哈希之前对密码和扩展进行排序,这使得指纹即使在Chrome的扩展顺序随机化下也能保持稳定。它也是人类可读的:指纹以a_b_c格式分为三个部分排列,因此分析人员可以匹配任何部分,而不是一个不透明的哈希。
以示例指纹JA4=t13d1516h2_8daaf6152771_02713d6af862为例:
a部分 —t13d1516h2是可读的元数据。t代表传输(t表示通过 TCP 的 TLS,q表示 QUIC,d表示 DTLS);13是 TLS 版本(1.3);d表示存在 SNI 域(i表示没有 SNI 或是 IP);15是密码套件数量,16是扩展数量,均不包括 GREASE;h2是第一个 ALPN 值的首尾字符。b部分 —8daaf6152771是密码套件的 12 个字符截断 SHA-256,转换为十六进制并排序。c部分 是扩展的 12 个字符截断 SHA-256,按十六进制值排序,后面跟着签名算法。SNI 和 ALPN 扩展在此计算中被移除,因此同一客户端无论连接到域名还是 IP,保持相同的c部分。
排序是破解随机化的切入点,JA3 的问题正是如此:不管你怎么重新排列 Chrome 的扩展,排序后的列表——因此 JA4——都是相同的。
JA4+ 套件不仅仅是 TLS
JA4 指纹识别 TLS 客户端,但它是更大家族中的一个成员。更广泛的 JA4+ 指纹识别套件 涵盖连接的多个层面,包括:
| 指纹 | 简称 | 识别内容 |
|---|---|---|
| JA4 | JA4 | TLS 客户端 |
| JA4Server | JA4S | TLS 服务器响应 |
| JA4HTTP | JA4H | HTTP 客户端 |
| JA4X509 | JA4X | X.509 TLS 证书 |
| JA4SSH | JA4SSH | SSH 流量 |
| JA4TCP | JA4T | TCP 客户端 |
| JA4Latency | JA4L | 客户端到服务器的延迟 |
JA4 TLS 客户端方法以 BSD 3-Clause 许可发布;其余 JA4+ 方法在 FoxIO License 1.1 下,且申请了专利。对于爬虫而言,JA4(TLS)和 JA4H(HTTP)是最常决定请求是被视为浏览器还是爬虫的两个方法。
为什么 TLS 指纹识别会阻止爬虫
TLS 指纹识别会阻止爬虫,因为请求一开始就没有呈现浏览器的指纹。像 requests、httpx、curl 或隐蔽补丁库这样的 HTTP 客户端,使用其自有库的密码和扩展集合进行 TLS 协商——这些集合没有真实的 Chrome 或 Firefox 生成。生成的 JA4 会归结为已知的非浏览器值,服务器可以拒绝或挑战该连接,无论请求头有多么可信。
这是用户代理伪装和代理轮换无法触及的层面。你可以从一个家庭 IP 发送 Mozilla/5.0 (… Chrome/126 …) 但仍然被标记,因为下面的 TLS 握手是由 OpenSSL 或 Go 的 crypto/tls 生成的,而不是 Chrome。手动匹配浏览器的 JA4 意味着要重现其确切的密码顺序、扩展集合和 ALPN——然后要跟上浏览器的更改。
如何呈现一个真实的 TLS 指纹
呈现浏览器 JA4 的可靠方法就是实际成为一个浏览器。Scrapeless Scraping Browser 是真实的、自主开发的 Chromium,因此它使用 Chrome 自有的堆栈进行 TLS 协商。它的 ClientHello——因此它的 JA3 和 JA4——是一个真正的 Chrome,这正是指纹识别服务器期待普通访问者的。专门用于爬虫,它带来了:
- 真实的 Chromium TLS 堆栈——密码套件、扩展和 ALPN 来源于 Chrome,因此 JA4 匹配真实的浏览器,而不是脚本库。
- 会话间一致的指纹,覆盖 TLS 和浏览器层面,没有
navigator.webdriver的指示与之矛盾。 - 覆盖 195 个国家的家庭出口,因此 IP 声誉与浏览器指纹匹配,而不是暴露数据中心地址。
在 app.scrapeless.com 的免费计划中获取你的 API 密钥。
在免费计划中获取你的 API 密钥: app.scrapeless.com
结论:指纹必须归属,而不仅仅是看起来正确
TLS指纹识别通过握手读取客户端,因此唯一持久的答案是一个真正属于浏览器的握手。JA3对原始ClientHello进行了哈希处理,但当Chrome随机化其扩展顺序时它就失效了;JA4对密码和扩展进行了排序并保持稳定,这就是为什么它现在是爬虫遇到的指纹。一个打补丁的HTTP客户端可以伪造头部并轮换IP,但在TLS层仍可能失败。运行真实的Chromium——带有Chrome的TLS堆栈、一致的指纹和住宅出口——呈现一个与普通访问者匹配的JA4。本文着眼于机制:有关如何通过该浏览器路由爬虫堆栈的操作工作流程,请参见清除TLS指纹检查的指南;有关相关的反检测层,请参见Scrapling生产爬虫指南,并在Scrapeless定价页面上比较计划。
准备呈现浏览器级TLS指纹?
加入我们的社区,索取免费计划,并与围绕基于指纹检测工作的开发者联系:Discord · Telegram。
在app.scrapeless.com注册以获取免费的爬虫浏览器运行时,让真实的Chromium呈现目标所期望的TLS指纹。
常见问题
问:JA3和JA4有什么区别?
JA3是原始顺序中ClientHello字段的MD5哈希;JA4在哈希之前对密码套件和扩展进行排序,并添加了可读的元数据前缀。排序使JA4在TLS扩展顺序随机化的情况下保持稳定,这使JA3哈希在不同连接间发生变化。
问:我可以通过更改用户代理来更改我的TLS指纹吗?
不可以。用户代理是握手后发送的HTTP头部;TLS指纹是源自握手本身的。它们是独立的层,这就是为什么伪造的用户代理对你的JA3或JA4没有任何影响。
问:即使使用住宅代理,我的爬虫为什么仍然被阻止?
住宅IP修复了网络层,但如果你的HTTP客户端与非浏览器的密码和扩展集协商TLS,它的JA4仍然将其识别为脚本。指纹和IP必须一致。
问:Scrapeless爬虫浏览器会将我的JA4更改为假的Chrome吗?
它不伪造任何东西——它是真正的Chromium,因此它与Chrome的实际堆栈协商TLS。它呈现的JA3/JA4属于真实的Chrome,因为握手确实来自Chrome。
问:TLS指纹识别与浏览器指纹识别是一样的吗?
不是。TLS指纹识别读取传输握手(密码、扩展、ALPN);浏览器指纹识别读取页面内部的属性(画布、字体、navigator值)。一个令人信服的会话需要两者结合才能看起来像真实浏览器。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



