Back to blog. Article language: BN EN ES FR HI ID PT RU UR VI ZH

TLS指纹识别与JA3:它如何影响数据抓取

TLS指纹识别通过TLS握手结构来识别HTTP客户端,这一过程发生在任何应用数据传输之前。JA3和JA4将ClientHello消息中的字段转换为简短的哈希值,反机器人系统会将该哈希值与已知的浏览器和机器人签名进行比对。如果声明的浏览器与哈希值不匹配,请求可能在标头被读取之前就遭到拒绝。

下文所有表格中使用的图例:✅ 供应商已记录 · ❌ 未提供或未记录 · ⚠️ 已记录但有限制 · 💡 实用提示。本页不使用其他标记。

什么是TLS指纹

TLS指纹是由HTTP客户端在tls握手期间(在加密尚未开始之前)发送的client hello消息中的字段构建的简短签名。理解JA3是什么从这里开始:JA3读取其中五个字段并将它们转换为单个哈希值。每个客户端,无论是Chrome、curl还是Python脚本,都以自己特定的顺序列出密码套件、扩展和椭圆曲线。服务器以明文形式读取这些数据,因为双方尚未就加密密钥达成一致。

client hello还携带一个alpn扩展,用于告知服务器连接偏好HTTP/1.1还是HTTP/2。不同的库根据底层TLS栈(例如OpenSSL、BoringSSL或NSS)以不同方式组装这些字段。这就是JA3和JA4共同使用的原始材料。

💡 提示:如果两个请求携带相同的指纹但声明的浏览器不同,仅这种不一致就足以引起怀疑,无需涉及任何标头欺骗。

JA3和JA4是如何计算的

JA3指纹的计算方法是将五个ClientHello字段连接成一个字符串,并用MD5进行哈希运算,生成32字符的签名(Scrapfly,JA3/JA4 TLS指纹识别指南,2026年)。John Althouse、Jeff Atkinson和Josh Atkins于2017年在Salesforce发布了这一原始方法,它至今仍是大多数基于TLS的机器人检测的支柱。参与该哈希运算的五个字段是TLS版本、密码套件、扩展、椭圆曲线和点格式,按固定顺序连接。

  1. 提取TLS版本,以十进制数表示,例如TLS 1.2对应771。
  2. 按照客户端发送的确切顺序列出密码套件,用连字符分隔。
  3. 按发送顺序列出TLS扩展,用连字符分隔,跳过GREASE值。
  4. 附加支持的椭圆曲线和点格式。
  5. 用逗号连接所有五个字段,并用MD5对结果字符串进行哈希运算,得到ja3哈希值。
展示JA3哈希如何从ClientHello字段构建的示意图

JA3哈希如何从ClientHello构建

较新的方法避开了步骤3中的顺序问题。它不按发送时的顺序记录扩展,而是按十六进制值对它们进行排序,即使在浏览器于2023年开始随机化扩展顺序之后,这也能保持JA4指纹的稳定(Scrapfly,2026年)。该后继哈希还弃用MD5转而采用截断的SHA-256,并增加了ALPN和QUIC支持,这些细节是JA3从未涵盖的。

标准 JA3 后继方法
哈希算法 MD5 截断的SHA-256
扩展顺序 按发送顺序 按十六进制值排序
QUIC/HTTP3支持 ❌ 未提供 ✅ 已记录
包含ALPN ❌ 未提供 ✅ 已记录
创建时间 2017年,Salesforce 2023年,FoxIO

这些结构性差异对于测试自己客户端的人来说很重要。以一种方式计算的指纹不会与为另一种方法构建的数据库匹配。

为什么仅靠代理无法解决指纹识别问题

代理改变请求的来源IP地址,但完全不触及tls握手,因此TLS指纹识别仍然能看到发起连接的那个库。握手直接发生在客户端和目标服务器之间,使用CONNECT方法的标准HTTPS代理只是隧道传输加密字节,不会触及它们(Shifter,TLS指纹术语表,2026年)。这意味着干净的住宅IP配上默认的Python客户端,仍然会提交一个读起来像脚本而非浏览器的指纹。

在我们2026年8月的测试中,通过三种不同代理类型路由的默认requests会话每次都返回相同的哈希值,无论IP信誉或地理位置如何。只有更换底层TLS库才能改变结果。这是对话中坦诚的部分:IP质量和指纹匹配解决的是两个独立的问题,把其中一个当作另一个的解决方案很快就会导致失望。

"TLS指纹识别发生在第一个HTTP字节落地之前。更换IP地址对底层的握手没有任何影响。" - Insocks工程笔记,2026年8月

  • ❌ 住宅IP不会重写密码套件顺序。
  • ❌ 轮换代理不会触及TLS握手字段。
对比代理改变的内容与其未触及内容的示意图

代理改变的内容及其未触及的内容

  • ✅ 匹配真实浏览器的TLS栈才是真正改变指纹的方法。

反机器人系统如何使用TLS指纹

反机器人系统从每个传入的ClientHello计算哈希值,并与已知浏览器和机器人指纹的数据库进行比对,然后在决定拦截、质询还是放行之前,将该信号与其他层面结合。TLS指纹识别完全位于HTTP标头之下,这就是为什么完美的标头配上脚本化的TLS栈仍然会被标记。Cloudflare在其机器人管理产品中记录了JA3和JA4字段,其他供应商也运行类似的检查(Scrapfly,2026年)。评分将TLS信号与请求时序、IP信誉和行为数据混合,而不是仅依赖单一字段。

一些供应商在握手检查之上添加http2指纹识别,读取客户端在TLS层完成后如何协商流优先级和窗口大小。这一第二层与JA3和JA4哈希一起输入更广泛的反机器人检测评分。随着浏览器版本的发布,供应商会持续更新这些数据库,上一季度还能通过的指纹可能在浏览器更新改变其默认设置后开始失败。

信号 揭示的内容 典型处理方式
JA3哈希与User-Agent不匹配 声明的浏览器与TLS栈不符 ⚠️ 已记录但有限制,通常会触发质询
跨会话的静态哈希 同一脚本被反复使用 ⚠️ 已记录但有限制,触发速率限制
匹配已知机器人数据库 指纹与常见库的默认值相关联 ❌ 未提供,经常被直接拦截
一致的类浏览器配置 符合预期的浏览器行为 ✅ 已记录,通常通过

跨层一致性:TLS、HTTP/2、标头和IP

跨层一致性意味着tls握手、http2设置帧、声明的User-Agent以及IP的网络类型都需要指向同一个故事——一个真实的浏览器或真实的客户端,而不是由不匹配信号拼凑而成。Http2指纹识别关注客户端在握手完成后如何协商流优先级和窗口大小,这是某些反机器人供应商与JA3和JA4数据一同检查的第二层(Scrapfly,2026年)。修复了TLS栈但忽略HTTP/2设置的抓取器仍然留下了明显的缺口。

展示四个请求层及其各自揭示内容的示意图

请求暴露的四个层面及其各自揭示的内容

User agent一致性也很重要,因为声称Chrome 124的User-Agent字符串配上过时的JA4指纹配置,其本身就构成一种矛盾。即使每个单独的标头看起来都正确,反机器人供应商也会标记这种不匹配。这些检查都不需要在目标站点上绕过任何东西;它们只是确认客户端自身的信号在请求发出之前彼此一致。

层面 必须匹配的内容 如何检查
TLS握手 声称浏览器的密码套件和扩展顺序 将JA3/JA4哈希与已知浏览器样本进行比较
HTTP/2设置帧 窗口大小、标头表大小、流优先级 对照浏览器默认值检查帧值
标头 User-Agent、Accept-Language、Sec-CH-UA(如存在) 手动审查或使用标头检查工具
IP/网络 ASN类型与声称的客户端匹配,住宅还是数据中心 检查IP信誉并进行ASN查询

如何测试您自己的TLS指纹

测试指纹首先要向检测端点发送一个干净的请求,然后与访问同一端点的真实浏览器进行并排比较。JA4指纹将TLS版本、密码套件数量、扩展数量和第一个ALPN值组合成一个可读字符串,这使得直观比较比阅读原始哈希更容易(Scrapfly,JA3/JA4指纹工具,2026年)。在不同日期运行相同的测试两次,也有助于确认结果在库更新后保持稳定。

为此构建的工具,包括Scrapfly自己的检测器和第三方库(如curl impersonate,此处仅使用该工具名称用于识别目的),专门用于使这种比较成为可能而无需猜测。运行Playwright或Puppeteer的无头浏览器也提供真实的握手用于比较,因为它启动的是真实的浏览器引擎而非脚本化的TLS栈。

  • 步骤1。 从受审查的客户端向指纹测试端点发送请求,并记录其返回的哈希值。
  • 步骤2。 在真实的最新版浏览器中打开同一端点,并记录其自身的哈希值以供比较。
  • 步骤3。 并排比较密码套件、扩展数量和ALPN值,而不是仅凭哈希匹配来判断。
  • 步骤4。 检查声明的User-Agent标头是否与实际观察到的TLS配置一致。
  • 步骤5。 记录带日期的结果,因为库或浏览器更新后哈希值可能发生变化。

👉 想看看正确配置的客户端端到端表现如何?在运行完整测试批次之前,先通过Insocks 试用演示

稳定数据采集的白帽实践

白帽数据采集从目标站点自身的规则开始:优先使用官方API、尊重robots.txt,并将请求速率保持在远低于可能给服务器造成压力的水平。重新审视JA3是什么有助于解释为什么完整的浏览器引擎而非标头技巧往往产生最稳定的结果,因为真实浏览器的TLS栈默认已经与其自身声明的身份匹配。Playwright、Puppeteer和Selenium都启动真实的浏览器引擎,因此它们的握手无需任何额外配置就看起来像Chrome或Firefox(Scrapfly,2026年)。

当完整浏览器对于手头任务来说太重时,一些团队会选择curl impersonate或类似的库,只要将生成的指纹先与真实浏览器进行测试,这是一个合理的权衡。将任一方法与合理的时序和清晰的User-Agent结合使用,可以保持采集过程可预测且易于日后审计。

  • ✅ 尽可能使用官方API和已记录的端点。
  • ✅ 尊重robots.txt和目标站点发布的条款。
  • ✅ 将请求分散开来,而不是对单一端点发起突发式请求。
  • ✅ 优先使用完整浏览器自动化,而非零碎的标头或TLS欺骗。
  • 💡 较慢、稳定的采集计划通常比快速、突发式的计划产生更少的支持工单。

通过在美国使用这种方法,团队可以确认其采集过程符合当前美国法律以及目标站点自身的服务条款。

常见错误

当团队检查自己的设置时,一些流程错误会反复出现。只测试一次并且在库更新后从不重复检查是最常见的一种,因为TLS指纹识别结果可能在依赖项升级其TLS后端的那一刻就发生变化。在与生产环境不匹配的预发布环境中运行测试是另一种,因为重要的是实际的请求路径,而不是本地shell。

  • ❌ 只测试一次并假设结果永远有效。
  • ❌ 在与任务实际运行环境不同的环境中检查指纹。
  • ❌ 信任单一验证服务而没有第二个比较点。
  • ❌ 只关注TLS层而忽略HTTP/2设置。

代理质量如何融入整体图景

披露:Insocks是我们的服务,本节描述代理基础设施在更广泛的采集栈中实际发挥的作用。良好的代理基础设施解决IP层问题:地理位置、IP信誉和连接稳定性,而TLS指纹识别仍然是代理无法单独触及的独立层。可靠的正常运行时间和干净的IP池 对于避免基于IP的速率限制很重要,但它们对握手内的密码套件顺序或扩展列表毫无影响。

我们出售用于采集工作的住宅代理静态IP代理,两者都具有已记录的协议支持和位置数据。将可靠的代理基础设施与正确配置的客户端(无论是完整的浏览器引擎还是精心匹配的库)相结合,可以同时解决这两个层面,而不是让其中一个暴露在外。

特性 实际意义
住宅和ISP IP池 减少基于IP的信誉标记,不触及TLS
地理定位 将请求来源匹配到目标市场
会话控制 在多步骤流程中保持IP一致
正常运行时间和支持 减少与指纹识别无关的连接失败

代理解决的是网络层,而不是TLS指纹,任何暗示其他方面的供应商都在夸大更换IP所能起到的作用。需要同时解决这两个层面的团队通常会将优质代理基础设施(如Insocks住宅和ISP代理)与基于浏览器的或正确匹配的客户端配对使用。

🔗 注册以获得完全访问权限,在确定方案之前比较代理池。

关键要点

  • tls握手在任何HTTP标头之前被读取,这就是这种检测方法的全部基础。
  • JA3的后继哈希即使在扩展顺序被随机化后仍保持稳定,这与它的前身不同。
  • 理解JA3是什么可以阐明为什么类浏览器客户端比脚本化客户端更稳定地通过检查。
  • 代理解决IP问题;它们从不会自行重写tls握手。
  • 完整浏览器自动化仍然是获得一致的、类浏览器JA3指纹的最可靠途径。

披露与数据来源

本文中的所有数据,包括价格、资费等级、限制和产品可用性,均以本页显示的发布日期为准。供应商条款经常在不另行通知的情况下变更,入门等级随采购量变动,并且在您阅读本文当天可能适用促销价格。本文内容不构成要约、对当前条款的保证或购买建议。

本文由Insocks发布。我们销售代理,并在上文的最后一节中披露了商业利益。代理不会改变JA3指纹或任何其他TLS信号,我们直接说明这一点,而不是暗示其他情况。本文提及的测试工具和库,包括Scrapfly的检测器、curl-impersonate和浏览器自动化框架,属于其各自的所有者,仅用于识别目的。本文中的细节已于2026年8月核实,客户端行为可能因库或浏览器版本不同而变化。

常见问题解答

以下问题涵盖了人们首次阅读该主题后通常会问的基础问题。答案保持简短且符合事实,与浏览器标签页或命令行工具实际显示的内容一致。这些内容均不是绕过指南,因为这里的目的是理解,而不是规避。

什么是TLS指纹?

由握手数据构建的简短签名,用于识别建立连接的软件。

JA3哈希是如何计算的?

握手中的五个字段被组合并哈希成32字符的字符串。

JA3和JA4有什么区别?

较新的方法对扩展进行排序并使用更强的哈希算法,在浏览器随机化顺序后仍保持稳定。

住宅代理能隐藏我的TLS指纹吗?

不能,代理只更改IP地址;握手原样通过。

为什么我的抓取器标头正确仍被拦截?

标头在握手之后才加载,因此不匹配的客户端配置会首先被标记。

如何检查我自己的TLS指纹?

向公共检测工具发送请求,并与真实浏览器的结果进行比较。

2026-09-03