爬虫技巧-TLS指纹认证绕过(详细讲解)
字数 1372 2025-08-11 17:39:47
TLS指纹认证绕过技术详解
1. TLS指纹基本概念
1.1 什么是TLS指纹
TLS指纹(TLS fingerprint)是一种通过分析客户端在TLS握手阶段发送的信息来识别客户端类型的技术。不同的TLS实现(浏览器/各种语言的HTTP库)在建立TLS连接时发送的信息(支持的密码学套件、签名算法等)各不相同。
1.2 JA3算法
JA3是一种用于计算TLS指纹的标准化算法,它通过对以下信息进行哈希处理生成唯一ID:
- TLS版本
- 支持的密码套件
- 扩展列表
- 支持的椭圆曲线
- 支持的椭圆曲线格式
1.3 指纹查询网站
- TLS指纹数据库: https://tlsfingerprint.io/
- JA3指纹查询: JA3.ZONE | JA3 Fingerprint Database (仅支持浏览器查询)
2. TLS指纹的应用场景
服务器可以通过TLS指纹:
- 识别并屏蔽非浏览器客户端(如Python、Go、Node.js等HTTP库)
- 要求交互全程使用相同的TLS指纹(防止交替使用浏览器和脚本)
- 实现更精确的反爬虫机制(不受HTTP头部修改的影响)
3. 绕过TLS指纹的方法
3.1 Python实现
3.1.1 使用Python-TLS-Client库
安装方法:
pip install tls-client
基本使用方法:
import tls_client
# 模拟特定浏览器
session = tls_client.Session(
client_identifier="chrome_105" # 支持chrome, firefox, opera, safari等
)
res = session.get(
"https://www.example.com/",
headers={"key1": "value1"},
proxy="http://user:password@host:port"
)
高级自定义配置:
session = tls_client.Session(
ja3_string="771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513,29-23-24,0",
h2_settings={
"HEADER_TABLE_SIZE": 65536,
"MAX_CONCURRENT_STREAMS": 1000,
"INITIAL_WINDOW_SIZE": 6291456,
"MAX_HEADER_LIST_SIZE": 262144
},
# 更多配置参数...
)
打包注意事项:
需要根据平台添加静态库依赖:
- Linux Ubuntu/x86:
--add-binary '{path_to_library}/tls_client/dependencies/tls-client-x86.so:tls_client/dependencies' - MacOS M1:
--add-binary '{path_to_library}/tls_client/dependencies/tls-client-x86.dylib:tls_client/dependencies' - Windows:
--add-binary '{path_to_library}/tls_client/dependencies/tls-client.dll;tls_client/dependencies'
3.2 Go语言实现
3.2.1 使用tls-client库
项目地址: https://github.com/bogdanfinn/tls-client
基本使用方法:
package main
import (
"fmt"
"io"
"log"
http "github.com/bogdanfinn/fhttp"
tls_client "github.com/bogdanfinn/tls-client"
)
func main() {
jar := tls_client.NewCookieJar()
options := []tls_client.HttpClientOption{
tls_client.WithTimeoutSeconds(30),
tls_client.WithClientProfile(tls_client.Chrome_105),
tls_client.WithNotFollowRedirects(),
tls_client.WithCookieJar(jar),
}
client, err := tls_client.NewHttpClient(tls_client.NewNoopLogger(), options...)
// 请求代码...
}
3.3 Node.js实现
Node.js不能完全控制TLS配置,但可以修改部分参数绕过简单黑名单:
const tls = require('tls');
const https = require('https');
// 修改密码套件顺序
const defaultCiphers = tls.DEFAULT_CIPHERS.split(':');
const shuffledCiphers = [
defaultCiphers[0],
defaultCiphers[2], // 交换第2和第3个密码套件
defaultCiphers[1],
...defaultCiphers.slice(3)
].join(':');
https.get('https://example.com', {
ciphers: shuffledCiphers
}).on('response', (res) => {
console.log(res.statusCode);
});
4. 技术要点总结
- 指纹生成原理:JA3算法对TLS握手参数进行哈希生成唯一指纹
- 绕过核心思路:完全模拟目标浏览器的TLS握手行为
- 实现层级:
- Python/Go:通过底层库实现完全控制
- Node.js:只能进行部分参数修改
- 适用场景:
- 黑名单过滤:修改足够参数即可绕过
- 白名单过滤:需要完全模拟特定浏览器
5. 最佳实践建议
- 优先使用Python-TLS-Client或Go的tls-client库实现完整模拟
- 对于简单防护,Node.js的部分修改可能足够
- 注意打包时的依赖问题,确保静态库正确包含
- 定期更新客户端指纹,跟随浏览器版本升级
- 结合其他反检测技术(如User-Agent、浏览器行为模拟)增强效果