绕过TLSakamai指纹护盾
字数 1656 2025-08-11 00:55:10
绕过TLS与Akamai指纹护盾技术详解
1. 前言
本文详细讲解如何绕过TLS指纹识别和Akamai指纹(HTTP/2指纹)识别技术,适用于爬虫开发者和安全研究人员。当使用Python脚本或curl请求被拦截,而浏览器访问正常时,很可能遇到了这类指纹护盾。
2. TLS指纹识别与绕过
2.1 TLS指纹原理
TLS指纹通过分析TLS握手过程中的以下信息来识别客户端:
- 密码套件
- 协议版本
- 加密算法
- 压缩算法
- TLS扩展
- 椭圆曲线算法
JA3算法是常用的TLS指纹计算方法,其开源实现:https://github.com/salesforce/ja3
2.2 测试TLS指纹
测试网站:https://tls.browserleaks.com/json
JA3指纹格式示例:
771,4865-4866-4867-49195-49196-49199-49200-52393-52392...,0-11-10-35-22-23-13-43-45-51-21,29-23-30-25-24,0-1-2
各部分含义:
- JA3版本号
- 加密套件列表
- 支持的压缩算法
- TLS扩展
- 椭圆曲线算法
2.3 绕过TLS指纹的方法
方法零:使用原生urllib伪造
import urllib.request
import ssl
context = ssl.create_default_context()
context.set_ciphers("ECDHE-RSA-AES128-GCM-SHA256+ECDHE+AESGCM")
url = 'https://tls.browserleaks.com/json'
req = urllib.request.Request(url)
resp = urllib.request.urlopen(req, context=context)
print(resp.read().decode())
方法一:使用curl_cffi库
from curl_cffi import requests
print("edge99:", requests.get("https://tls.browserleaks.com/json",
impersonate="edge99").json().get("ja3_hash"))
print("chrome110:", requests.get("https://tls.browserleaks.com/json",
impersonate="chrome110").json().get("ja3_hash"))
print("safari15_3:", requests.get("https://tls.browserleaks.com/json",
impersonate="safari15_3").json().get("ja3_hash"))
# 支持代理
proxies = {"https": "http://localhost:7890"}
r = requests.get("https://tls.browserleaks.com/json",
impersonate="chrome101", proxies=proxies)
print(r.json().get("ja3_hash"))
支持的浏览器类型:
- edge99, edge101
- chrome99, chrome100, chrome101, chrome104, chrome107, chrome110
- chrome99_android
- safari15_3, safari15_5
方法二:使用客户端代理
通过Burp等代理工具完成TLS握手,利用代理的TLS指纹绕过检测。
方法三:修改requests底层代码
修改urllib3的SSL配置:
- 找到urllib3安装位置:
python3 -c "import urllib3; print(urllib3.__file__)"
- 修改
site-packages/urllib3/util/ssl_.py中的DEFAULT_CIPHERS:
DEFAULT_CIPHERS = ":".join(
[
"ECDHE+AESGCM",
"ECDHE+CHACHA20",
"DHE+AESGCM",
"DHE+CHACHA20",
"ECDH+AESGCM",
"DH+AESGCM",
"ECDH+AES",
"DH+AES",
"RSA+AESGCM",
"RSA+AES",
"!aNULL",
"!eNULL",
"!MD5",
"!DSS",
]
)
3. Akamai指纹(HTTP/2指纹)识别与绕过
3.1 Akamai指纹原理
Akamai指纹通过分析HTTP/2协议的以下特征:
- 头部表大小(HEADER_TABLE_SIZE)
- HTTP/2版本(HTTP2_VERSION)
- 最大并发流数(MAX_CONCURRENT_STREAMS)
- 初始窗口大小(INITIAL_WINDOW_SIZE)
- 动态表大小(max header list size)
- 窗口更新(WINDOW_UPDATE)
- 头部压缩设置
- 特殊头部字段(:method, :authority等)
示例指纹:
1:65536,2:0,3:1000,4:6291456,6:262144|15663105|0|m,a,s,p
详细解释:
1:65536: 头部表大小64KB2:0: 使用HTTP/2协议3:1000: 最大并发流数10004:6291456: 初始窗口大小6MB6:262144|15663105|0|m,a,s,p:- 262144: 动态表大小256KB
- 15663105: 窗口更新字节数
- 0: 不启用头部压缩
- m,a,s,p: 特殊头部字段编码
3.2 测试Akamai指纹
测试网站:https://tls.browserleaks.com/json 或 https://tls.peet.ws/api/all
3.3 绕过Akamai指纹的方法
方法一:使用curl_cffi库
from curl_cffi import requests
print("edge99:", requests.get("https://tls.browserleaks.com/json",
impersonate="edge99").json().get("akamai_hash"))
print("chrome110:", requests.get("https://tls.browserleaks.com/json",
impersonate="chrome110").json().get("akamai_hash"))
print("safari15_3:", requests.get("https://tls.browserleaks.com/json",
impersonate="safari15_3").json().get("akamai_hash"))
支持的浏览器类型与TLS指纹绕过相同。
4. 实战案例
绕过ascii2d.net的CloudFlare指纹护盾:
from curl_cffi import requests
req = requests.get("https://ascii2d.net", impersonate="chrome110")
print(req.text)
5. 关键点总结
- TLS指纹识别基于JA3算法,分析握手过程中的加密套件、扩展等特征
- Akamai指纹分析HTTP/2协议的各种参数和特征
- curl_cffi是最方便的解决方案,支持模拟多种浏览器指纹
- 修改底层库(urllib3)是更彻底的解决方案但维护成本高
- 代理工具可以作为临时解决方案
6. 参考资源
- JA3算法: https://github.com/salesforce/ja3
- curl_cffi库: Python binding for curl-impersonate
- HTTP/2指纹详解: Passive Fingerprinting of HTTP/2 Clients