百趣云 百趣云的博客

HTTP/2 指纹:SETTINGS 帧里的第二张身份证

TLS 指纹之后还有 H2 指纹

过了 JA3 检测却被更隐蔽的指纹拦下——问题可能出在 HTTP/2 层。现代网站 90%+ 走 HTTP/2,而 H2 连接的建立过程同样暴露客户端实现:

  • SETTINGS 帧:参数集合和值(HEADER_TABLE_SIZE、INITIAL_WINDOW_SIZE 等)
  • WINDOW_UPDATE 帧:窗口增量的数值
  • HEADERS 帧:伪头顺序(:method :path :authority :scheme 还是别的排列)
  • 优先级策略:PRIORITY 帧的使用模式

这些全部由 HTTP/2 库的实现决定——Chrome 的 netstack、nghttp2(curl/很多库用它)、Go 的 http2,各有各的固定值。

Akamai 指纹:H2 指纹的标准化

和 JA3 对应,H2 指纹的标准叫 Akamai 指纹(Akamai 提出的格式):

格式: SETTINGS参数;WINDOW_UPDATE;优先级帧;伪头顺序
Chrome: 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p
Python httpx: 1:65535;2:0;3:1000;4:6291456;6:262144|...|...|m,s,a,p

注意最后的伪头顺序差异:Chrome 是 method,authority,scheme,path(m,a,s,p),很多库是 m,s,a,p——伪头顺序是最常被忽视的指纹点

检测自己的 H2 指纹

curl -s https://tls.peet.ws/api/all | jq '.http2'
# 输出 akamai_fingerprint 和 sent_frames 详情

各语言库的 H2 指纹现状

H2 指纹
Python requests不支持 H2(H1 本身就是指纹)
Python httpxnghttp2 风格,可部分配置
Python curl_cffi完整模拟浏览器 H2 指纹
Go net/httpGo 特有指纹,要用 uTLS + 自定义 transport
Node.js undiciNode 特有指纹

这就是 curl_cffi 在指纹对抗里碾压其他 Python 库的原因——它不只改 JA3,H2 的 SETTINGS、窗口、伪头顺序全部按目标浏览器对齐。

精髓一:伪头顺序的坑

自己实现 H2 客户端或用底层库时,伪头顺序是最容易翻车的点。Chrome 的顺序:

:method → :authority → :scheme → :path

而 RFC 7540 建议伪头在普通头之前即可,没规定顺序——所以顺序成了实现指纹。用 hyper-h2 这类底层库时,显式控制头部顺序:

# hyper-h2 手动控制头部顺序
headers = [
    (':method', 'GET'),
    (':authority', 'target.com'),
    (':scheme', 'https'),
    (':path', '/api'),
    ('user-agent', '...'),
    # ... 普通头也要按浏览器顺序(accept-encoding 等的位置)
]

普通头的顺序同样是指纹(Chrome 的头顺序是固定的),对拍时逐字段对齐。

精髓二:H1 还是 H2 的选择

有个反直觉的技巧:部分场景主动降级 HTTP/1.1 反而更安全

  • 目标站点同时支持 H1 和 H2
  • 你的 H2 指纹模拟不完美,但 H1 的指纹面小得多(没有 SETTINGS 帧这些)
  • 强制 H1:curl_cffi 里配置,或直接用 requests(只支持 H1)+ 完美 ua

代价是失去 H2 多路复用的性能。低频协议模拟场景,这个取舍经常划算。

精髓三:指纹对拍的完整清单

完整的指纹对拍要覆盖四层:

  1. TLS 层:JA3 / JA4(新版指纹标准,覆盖更多字段)
  2. H2 层:Akamai 指纹(SETTINGS + 窗口 + 伪头序)
  3. HTTP 层:头部顺序、头部大小写(H1 时)
  4. TCP 层:窗口大小、TTL、MSS(操作系统指纹,代理可以掩盖)

tls.peet.ws/api/all 一次返回 1-3 层全部信息。TCP 层指纹(p0f 风格)由操作系统决定,Python 脚本和浏览器如果跑在同一台机器上则天然一致——走代理时代理的出口机器指纹会覆盖你的,一般不用操心。

总结

  1. H2 指纹 = SETTINGS + WINDOW_UPDATE + 伪头顺序,Akamai 指纹是标准格式
  2. 伪头顺序是最隐蔽的指纹点,Chrome 是 m,a,s,p
  3. curl_cffi 完整模拟 H2 指纹,其他 Python 库基本裸奔
  4. 对拍覆盖 TLS/H2/HTTP 三层,tls.peet.ws 一站搞定

交流微信:run1255

By 百趣云 阅读量:7 On