词汇表

什么是 TLS 指纹(JA3 / JA4)?

TLS 指纹是从客户端 TLS 握手的特定结构(加密套件列表、扩展项、ALPN 值、GREASE 字节等)中提取的哈希值,用于在任何应用层数据交换之前识别底层 HTTP 客户端、浏览器或库。

了解 JA3 和 JA4 的工作原理,为什么它们能在你的爬虫发送 HTTP 请求之前就揭示你正在使用 Python requests 或 curl,以及如何消除这一问题。

详解

当您的客户端建立 TLS 连接时,最开始的几个字节是一个 ClientHello 数据包,其中描述了您的客户端支持哪些加密套件、TLS 版本、扩展、椭圆曲线以及 ALPN 值。这些属性的具体列表和排列顺序因实现而异——Chrome 的 ClientHello 与 Firefox 的不同,Firefox 的与 curl 的不同,curl 的又与 Python 的 `requests` 库不同,以此类推。

JA3(及其后继版本 JA4)是一种哈希格式,能够将 ClientHello 的结构转换为一个简短的标识符。反爬虫厂商会对每一个传入的 TLS 连接计算该哈希值,并与已知特征库进行比对。如果您的爬虫使用 Python `requests`,您的 TLS 指纹将与 OpenSSL 默认值相匹配,并会被立即识别为"非真实浏览器"——甚至在您发送任何一个 HTTP 字节之前就已如此。

这正是为什么许多爬虫在 Cloudflare、Akamai 及类似技术栈上失败的原因,即便 IP 和 User-Agent 看起来完全正常。TLS 层会暴露出该请求并非来自 Chrome。现代隐身库(如 `curl_cffi`、`tls-client`,以及配合正确启动参数的 Playwright)会模拟真实浏览器的 TLS 指纹,从而规避这一检测。

工作原理

JA3 从 ClientHello 的五个字段构建指纹:TLS 版本、支持的加密套件、支持的扩展、支持的椭圆曲线以及支持的椭圆曲线点格式。它将这些字段拼接后进行 MD5 哈希,生成一个 32 字符的签名。

JA4(现代替代方案)在此基础上扩展了 ALPN、版本、SNI 是否存在、GREASE 处理,并以一种对随机化具有鲁棒性的稳定方式对扩展进行排序。JA4 还具有针对 QUIC(JA4Q)、HTTP(JA4H)和 SSL 会话(JA4S)的变体。服务器计算指纹后,将其与允许/拒绝列表进行比对,或将其与其他信号一起输入风险评分模型。

类型

JA3

原始 TLS ClientHello 指纹,由有序的加密套件 / 扩展 / 曲线 / 格式字段的 MD5 值组成。应用广泛,但易受现代浏览器中扩展顺序随机化的影响。

JA3S

JA3的服务器端对应项,对TLS ServerHello进行指纹识别。用于识别服务器软件栈而非客户端。

JA4

JA3 的现代继任者。更稳健地处理 GREASE、随机化和扩展排序。细分为 JA4(TCP)、JA4Q(QUIC)、JA4H(HTTP)、JA4L(延迟)、JA4T(TCP 指纹)、JA4X(X.509 证书)。

Akamai BMP / Datadome / Cloudflare bot.management

专有的反机器人指纹技术,在JA3/JA4基础上融合了额外信号(TLS扩展顺序随机化特征、GREASE字节检测、数据包时序分析)。若不使用真实浏览器,实际上无法伪造。

常见使用场景

在任何 HTTP 层之前识别 HTTP 客户端(curl、requests、Python http.client)
TLS层的机器人防御
网络取证与IDS规则
按客户端类型进行速率限制
检测自定义或修改过的爬取客户端
常见问题

常见问题

关于以下内容的常见问题 tls 指纹.

User-Agent 是您的客户端以明文发送的 HTTP 标头,可以设置为任意值。JA3 是从 TLS 握手本身的结构计算得出的,仅通过设置标头无法更改它。要更改您的 JA3,必须更改底层 TLS 客户端库或其配置。