一、什么是TLS指纹
TLS 指纹也叫 JA3 指纹,是指在 TLS 握手过程中,客户端(通常是浏览器)向服务器发送的特定参数组合,这些参数形成了独特的 “数字足迹”,可用于识别设备、浏览器或用户。具体介绍如下:
- 形成原理:TLS 指纹主要由 TLS 握手过程中的多个参数构成,包括 TLS 版本,如 TLS 1.2 或 TLS 1.3;客户端支持的加密算法组合及优先级顺序,如 AES_256_GCM、CHACHA20_POLY1305 等;TLS 扩展,如 SNI、ALPN等;椭圆曲线算法,如 secp256r1、curve25519;以及签名算法、会话票据等其他参数。在 TLS 握手时,客户端将这些参数发送给服务器,服务器可根据参数组合生成一个哈希值或指纹 ID。
- 主要应用:TLS 指纹技术被广泛应用于安全检测领域,可用于区分真实用户与爬虫,因为爬虫的 TLS 指纹通常与普通浏览器不一致。还可以帮助网络管理员了解网络中 SSL/TLS 客户端的类型和行为,通过将检测到的 TLS 指纹与已知的恶意指纹数据库对比,识别潜在的安全威胁。
二、爬虫判断是否为指纹校验
浏览器正常访问,代码在排除掉常规反爬(IP、User-Agent、Cookie)后,请求仍被拦截报错代码403,大概率为指纹校验
三、解决方式
1.curl_cffi
from curl_cffi import requests
url = "https://tls.peet.ws/api/all"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
# 使用Chrome 124指纹
response = requests.get(url, headers=headers, impersonate="chrome124")
print(response.text)
2.rnet
from rnet import RnetClient
url = "https://tls.peet.ws/api/all"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
client = RnetClient()
# 自定义JA3指纹(需手动配置)
client.set_ja3("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")
response = client.get(url, headers=headers)
print(response.text)
3.cycurl
from cycurl import requests
url = "https://tls.peet.ws/api/all"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
# 使用Chrome 124指纹
response = requests.get(url, headers=headers, impersonate="chrome124")
print(response.text)
4.requests-go
import requests_go
url = "https://tls.peet.ws/api/all"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
tls = requests_go.tls_config.TLSConfig()
tls.ja3 = "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"
tls.pseudo_header_order = [":method", ":authority", ":scheme", ":path"]
response = requests_go.get(url=url, headers=headers, tls_config=tls)
print(response.text)