一、TLS 指纹是什么?
1.1 说明
TLS
指纹 也叫 JA3
指纹,是从 TLS
握手中提取特定数据,生成一个哈希值作为唯一指纹。TLS
指纹 反爬不那么容易一眼看出,如果碰到浏览器抓包无明显加密参数,使用抓包工具被检测,curl
请求和 request
请求会报错,排除其他反爬策略的可能,可以用 wireshark
抓包验证是否为 TLS
指纹,
1.2 特征
如图,JA3
就是 TLS
指纹加密数据,JA3 Fullstring
则是指纹信息的组成,将 JA3 Fullstring
的值进行 MD5加密后得到 JA3
。
1.3 指纹信息结构
JA3 Fullstring结构由
TLS Version, Cipher Suites, Extensions, supported_groups, ec_point_formats 这 5 部分组成,由 ,
隔开。
- 771:是
TLS Version
的版本用十进制表示的值,在抓包信息的表示方式是Version: TLS 1.2 (0x0303)
,括号内的0x0303
就是版本信息的值。
- 4865-4866-4867…-47-53:
Cipher Suites
的值,表示可接受的加密算法,在抓包信息中,Cipher Suites
下列出了所有可接受的加密算法,这个值来自于所包含的 TLS 相关算法末尾括号内容的十六进制转为十进制后的值。
- 43-65037-10…-65281-13:支持的扩展列表的值,抓包信息中,以
Extensions
前缀的的这些扩展项下的type
字段对应的值。
- 4588-29-23-24:代表支持的椭圆曲线组,在抓包信息中,
Extension: supported_groups (len=12)
下Supported Groups (5 groups)
包含的项所对应的值。
- 0:支持的椭圆曲线格式
二、解决方案
2.1 curl_cffi
基于 cur
l 请求,进行二次包装,添加浏览器的指纹信息,python
进行第三次封装成库,可以不用过多考虑当前浏览器的指纹信息,直接用库生成请求即可。
2.2 cycletls
支持直接复制浏览器的 ja3 指纹信息绕过校验。通过 https://tls.browserleaks.com/json 查看浏览器指纹信息,复制 ja3_hash
传递给 cycletls
请求的 ja3
参数即可。
const initCycleTLS = require('cycletls');
function api_test(){
(async () => {
// Initiate CycleTLS
const cycleTLS = await initCycleTLS();
// Send request
const response = await cycleTLS(url, {
body: 'page=1',
// 浏览器指纹信息
ja3: "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,27-13-10-11-51-35-18-17513-45-65281-0-65037-23-5-43-16,4588-29-23-24,0",
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
cookies: [
{
name: 'a',
value: 'xxxx',
domain: 'xxx',
path: '/',
expires: 1728826553, // 过期时间戳
secure: true,
httpOnly: false
},
{
name: '__yr_token__',
value: 'xxx',
domain: 'xxxxm',
path: '/',
secure: true,
httpOnly: false
},
],
}, 'post');
console.log("api_test -> ", response);
// debugger;
cycleTLS.exit();
})();
}
api_test();
三、交流群
不会经常刷博客,有需要者可以加本人,搜索 LOVE_SELF_AD_LIFE,进逆向群聊,一起探讨技术