一年前,方案很简单:你找一个能够伪造TLS握手的客户,选择一个适合最新Chrome的配置文件,获得匹配的JA4——然后反机器人就会放行。然而到了2026年,这个方法开始出现故障,原因与“绕过保护”毫无关系。浏览器大规模转向后量子密钥交换,而大多数抓取堆栈却没有。因此,缺乏后量子密钥共享本身就成为了自动化的标志。
我们来逐条分析:握手中具体发生了什么变化,哪些堆栈已经转变,哪些尚未转变,以及为什么匹配的JA4不再是充分条件。
发生了什么:后量子交换成为常态,而非异类
混合后量子密钥交换是经典椭圆曲线X25519与格基机制ML-KEM(NIST FIPS 203标准)的结合。如果两个组件中有一个是稳健的,会议就会保持安全。其意义在于防止“现在截获,之后解密”的场景,即流量被存档以备未来的量子计算机使用。
在客户端的实施时间表如下:
- Chrome 124(2024年4月)——混合后量子交换默认启用;在curl-impersonate的补丁中被记录为“在Chrome 124和130中引入的X25519Kyber768/X25519MLKEM曲线”。
- Firefox 132(2024年11月)——支持已启用。
- iOS和macOS上的Safari——后量子交换于2025年10月到来。
- OpenSSL 3.5.0(2025年4月)——混合组X25519MLKEM768、SecP256r1MLKEM768和SecP384r1MLKEM1024已加入TLS的默认组列表。
- Go 1.24(2025年2月)——X25519MLKEM768在crypto/tls中默认启用,除非明确指定Config.CurvePreferences。
从基础设施的角度来看,情况更加明显。Cloudflare Radar在2026年4月显示,约67%的HTTPS流量使用后量子加密——相比2025年1月的32%。Akamai于2026年1月31日将后量子密钥交换设为所有客户端连接的默认设置,并于3月完成网络推广。根据行业测量,约57.4%的所有浏览器交易已经具备后量子能力,其中Chrome的PQ能力比例约为93%。
请注意不对称性:源服务器的支持增长速度远远慢于客户端(Cloudflare约为9%)。也就是说,今天的后量子特性主要是客户端的特征。这正是反机器人所关注的。
标准1:密钥共享的大小和ClientHello的结构
后量子密钥共享并不是“扩展中的另一个标志”。它在物理上是庞大的:约1124字节,而经典的X25519只有36字节。后果在数据包层面上显而易见。
带有后量子密钥共享的ClientHello超过1400字节,无法放入一个TCP段。它被分割成两个或更多的数据包。接下来,检测中最有趣的部分开始了:不同实现的分片模式各不相同。堆栈如何切割大的ClientHello,发送段的顺序,以及时间间隔——这些都是可观察的行为,无法从JA4的哈希中推导出来,几乎没有抓取工具的作者有意识地重现这一点。
实际结论:反机器人出现了一个工作在低于常规指纹的层面。你可以完美地收集加密和扩展列表,但你会因为你的堆栈如何将字节放入套接字而暴露自己。
标准2:与声明的浏览器版本的一致性
2026年的主要陷阱是你所声称的身份与实际TLS堆栈所做的事情之间的不同步。
反机器人平台维护着标准ClientHello的数据库。一个在User-Agent和JA4中声明为Chrome 131的请求,但没有后量子密钥共享,与任何已知的有效Chrome 131都不匹配。这不是“可疑的”——这是逻辑上不可能的组合。真正的Chrome在默认设置下无法发送经典的密钥共享。
机器学习对此的分离能力也已被计算。使用JA4特征的CatBoost分类器在研究中显示出AUC 0.998和准确率0.9863; 单独的后量子流量与经典流量的区分准确率约为98%。这不是“带有误报的启发式”,而是几乎确定性的特征。
标准3:特定堆栈的准备情况
这里是实际的分界线。我们将其分组。
默认发送PQ密钥共享
- Chrome 124+、Firefox 132+、Safari(2025年10月起的iOS/macOS)——这是与之比较的标准。
- Go 1.24+——crypto/tls会自动包含X25519MLKEM768,除非你重写了CurvePreferences。重要的细节是:虽然有后量子能力,但裸Go客户端的JA4仍然不是浏览器指纹。你得到的是“PQ兼容,但看起来不像Chrome”的指纹。
- Node.js 24——使用自己的OpenSSL 3.5,因此默认组列表已经包括混合组。此外,node:crypto中增加了通过crypto.encapsulate()/decapsulate()和ML-DSA在sign()/verify()中的ML-KEM。
依赖于链接的内容
- Python: requests、aiohttp、httpx——使用ssl模块,而该模块使用系统的OpenSSL。在Ubuntu 24.04中,系统中存在OpenSSL 3.0.x,其中根本没有后量子组。要获得PQ,需要从源代码构建OpenSSL 3.5,通过LD_LIBRARY_PATH进行链接,并且很可能需要重新构建Python。实际上,这意味着:典型的Python抓取器在2026年发送经典的密钥共享,在Akamai上看起来像异常。
能够,但仅在选择正确的配置文件时
- curl_cffi / curl-impersonate——在分支中明确支持后量子曲线。但目标列表从chrome99到chrome146(在分支中——到chrome150),而旧配置文件重现的是当时的握手,即没有PQ。从两年前的指南中复制
impersonate="chrome116"是直接走向检测的道路。 - uTLS——同样的原则:HelloChrome低于131的配置文件不包含PQ密钥共享。此外,在2026年的库中修复了两个指纹漏洞:CVE-2026-26995(版本1.6.0–1.8.1)和CVE-2026-27017(1.6.0–1.8.0,GREASE ECH的密码选择不同步——Chrome确定性地选择,而uTLS中的parrot则在AES和ChaCha20之间抛硬币,这对于真正的Chrome来说是不可能的)。需要至少更新到1.8.2。
共同点是:工具大致上已经跟上。问题不在于它们,而在于配置比浏览器更新得更快。在2024年理想的配置文件,今天作为标记使用。
如何在五分钟内检查你的堆栈
- 使用你的实际客户端向
https://tls.peet.ws/api/all或ja4db.com发送请求——它们返回实时的JA3/JA4和ClientHello的JSON解析。 - 在解析中找到supported_groups和key_share列表。寻找X25519MLKEM768(或旧配置文件中的X25519Kyber768)。如果那里只有x25519/secp256r1——则没有后量子交换。
- 将其与您所声称的浏览器版本进行比较。如果您声明Chrome 131+而未看到PQ组——该组合无效,请修复配置文件。
- 查看ClientHello的大小。在声明为最新Chrome的情况下小于约1400字节——这是同样的标志,只是从另一个角度。
- 从每个出口节点运行检查,而不仅仅是从工作机器:企业网关或提供商的SSL检查可能会为您重写握手。
代理在这里做什么
重要的是不要混淆两个独立的层。后量子密钥共享是关于握手,地址的声誉是关于网络。反机器人将它们分开计算并加总。
由此产生两个实际的后果。首先:理想的居民IP无法拯救一个在TLS层面上自称为Chrome 131而没有PQ组的请求——在服务器查看地址之前,你就已经输了。其次,反之亦然:正确构建的后量子握手无助于如果你的一百个会话来自一个声誉受损的数据中心子网。两个层面都需要修复,并且它们需要不同的工具进行修复。
任务的实际划分:对于Akamai和Cloudflare的目标,既考虑握手又考虑网络,合理选择居民代理,同时将目标伪装提升到最新的Chrome。对于移动应用和IP声誉高于TLS要求的平台,通常更有利于使用移动代理。而对于自己的API、合作伙伴导出和内部监控,没有反机器人的情况下,支付居民代理没有意义——使用数据中心代理就足够了。
如果你从零开始处理指纹,先从基础开始:JA4的构造及其包含的内容。而当涉及到不仅仅是HTTP客户端,而是完整的浏览器时,隐形构建及其弱点的比较已单独收集——2026年nodriver、Camoufox和Patchright的测量。
结论
后量子密钥交换并不是作为反机器人机制而设计的。它意外地成为了反机器人机制:浏览器迅速且大规模地转向了它,基础设施(Akamai——自2026年1月31日起)将其设为默认,而抓取堆栈则分为三组——已经转变的、依赖于系统OpenSSL的以及仅在最新配置文件下能够工作的。
检查归结为一个问题:你的客户端是否发送X25519MLKEM768,并且这是否与您所声称的浏览器版本一致。如果没有——匹配的JA4无法拯救你,因为现在比较的不是哈希,而是整个握手的形式:密钥共享的大小、TCP段的数量及其发送顺序。好消息是,在大多数情况下,通过更新配置文件和库版本而不是重写抓取器可以解决这个问题。
