TLS 指纹识别 (JA3/JA4)
目录
TLS 指纹识别 (JA3/JA4)
思考时刻
在学习 TLS 指纹之前,先挑战你的认知:
- HTTPS 就安全了吗? 即使用了加密传输,网站还能识别出你是爬虫?
- 握手的秘密: 在 HTTPS 连接建立的一瞬间,浏览器暴露了哪些信息?
- 指纹的不可见性: 你用 Python requests 发请求,HTTP 头伪装得再像,为什么还是被识别出来?
- 实战场景: 某网站封禁了所有 Python requests 的访问(返回 403),但用浏览器访问正常。你连一个请求都没发,它是怎么知道的?
TLS 指纹,是应用层之下的"暗战"。
📚 前置知识
在开始本配方之前,建议先掌握以下内容:
| 知识领域 | 重要程度 | 参考资料 |
|---|---|---|
| TLS/SSL 握手 | 必需 | TLS/SSL 握手 |
| HTTP/HTTPS 协议 | 必需 | HTTP/HTTPS 协议 |
| Wireshark 使用 | 必需 | Wireshark 指南 |
| 浏览器指纹识别 | 推荐 | 浏览器指纹识别 |
⚠️ 重要提示: TLS 指纹是应用层之下的检测手段,无法通过修改 HTTP 头来伪装。如果你的爬虫被 TLS 指纹识别封禁,需要使用特殊的网络库或浏览器自动化方案。
概述
TLS 握手过程中,客户端会发送一系列参数(如支持的加密套件、扩展等),这些参数的组合可以作为指纹识别客户端类型。JA3/JA4 是目前最流行的 TLS 指纹技术。
TLS 握手回顾
| |
ClientHello 包含的信息:
- TLS 版本
- 支持的加密套件列表
- 支持的压缩方法
- 扩展(Extension)列表
JA3 指纹
1. 原理
JA3 将 ClientHello 中的关键字段拼接成字符串,然后计算 MD5。
字段:
| |
示例:
| |
计算 MD5:
| |
2. 用途
服务器端:
- 识别客户端类型(浏览器 vs 脚本)
- 封禁特定客户端(如 Python requests 的 JA3)
攻击者:
- 伪造浏览器的 TLS 指纹
JA3 检测
在线工具
- tls.peet.ws - 查看自己的 JA3
- JA3er - JA3 数据库
Wireshark 抓包
- 捕获 HTTPS 流量
- 过滤
ssl.handshake.type == 1(ClientHello) - 查看
Cipher Suites和Extensions
JA3 伪造
方法一:使用支持 TLS 指纹的库
Python - curl_cffi:
| |
Go - utls:
| |
方法二:使用真实浏览器(RPC)
通过 Puppeteer/Playwright 控制真实浏览器,天然具有正确的 TLS 指纹。
| |
JA4 - 下一代指纹
与 JA3 的区别
| 特性 | JA3 | JA4 |
|---|---|---|
| 格式 | MD5 哈希 | 人类可读字符串 |
| 协议支持 | TLS 1.0-1.3 | TLS 1.0-1.3, QUIC |
| 细粒度 | 中 | 高 |
| 可读性 | 低(哈希) | 高(分段字符串) |
JA4 示例:
| |
t13: TLS 1.3d15: 加密套件数量16: 扩展数量h2: ALPN (HTTP/2)
绕过 TLS 指纹检测
1. 使用模拟库
选择支持自定义 TLS 指纹的 HTTP 库:
curl_cffi(Python)utls(Go)tls-client(Python wrapper for Go utls)
2. 频繁更换指纹
即使被识别,也可以轮换不同的浏览器指纹(Chrome/Firefox/Safari)。
3. 使用住宅代理
高质量住宅代理通常会保留真实用户的 TLS 特征。
检测网站是否使用 TLS 指纹
方法:
- 用
requests库和真实浏览器分别访问同一接口 - 如果
requests返回 403/401,浏览器正常,可能是 TLS 指纹检测
验证:
| |
对比浏览器访问 https://tls.peet.ws/api/clean 的结果。
实战案例
案例:某社交媒体 API
现象: Python requests 请求返回 403,浏览器正常。
分析:
- 检查 User-Agent - 已伪造,仍然失败
- 检查 Cookie - 已携带,仍然失败
- 怀疑 TLS 指纹
解决:
| |
相关资源
相关章节
相关内容
如果这篇文章对你有帮助,请我喝杯咖啡吧~
支付宝
微信