绕过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

各部分含义:

  1. JA3版本号
  2. 加密套件列表
  3. 支持的压缩算法
  4. TLS扩展
  5. 椭圆曲线算法

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配置:

  1. 找到urllib3安装位置:
python3 -c "import urllib3; print(urllib3.__file__)"
  1. 修改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: 头部表大小64KB
  • 2:0: 使用HTTP/2协议
  • 3:1000: 最大并发流数1000
  • 4:6291456: 初始窗口大小6MB
  • 6: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. 关键点总结

  1. TLS指纹识别基于JA3算法,分析握手过程中的加密套件、扩展等特征
  2. Akamai指纹分析HTTP/2协议的各种参数和特征
  3. curl_cffi是最方便的解决方案,支持模拟多种浏览器指纹
  4. 修改底层库(urllib3)是更彻底的解决方案但维护成本高
  5. 代理工具可以作为临时解决方案

6. 参考资源

  1. JA3算法: https://github.com/salesforce/ja3
  2. curl_cffi库: Python binding for curl-impersonate
  3. HTTP/2指纹详解: Passive Fingerprinting of HTTP/2 Clients
绕过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指纹格式示例: 各部分含义: JA3版本号 加密套件列表 支持的压缩算法 TLS扩展 椭圆曲线算法 2.3 绕过TLS指纹的方法 方法零:使用原生urllib伪造 方法一:使用curl_ cffi库 支持的浏览器类型: edge99, edge101 chrome99, chrome100, chrome101, chrome104, chrome107, chrome110 chrome99_ android safari15_ 3, safari15_ 5 方法二:使用客户端代理 通过Burp等代理工具完成TLS握手,利用代理的TLS指纹绕过检测。 方法三:修改requests底层代码 修改urllib3的SSL配置: 找到urllib3安装位置: 修改 site-packages/urllib3/util/ssl_.py 中的DEFAULT_ CIPHERS: 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 : 头部表大小64KB 2:0 : 使用HTTP/2协议 3:1000 : 最大并发流数1000 4:6291456 : 初始窗口大小6MB 6: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库 支持的浏览器类型与TLS指纹绕过相同。 4. 实战案例 绕过ascii2d.net的CloudFlare指纹护盾: 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