
技术分享1 分钟阅读
curl_cffi 实现模拟浏览器TLS或者JA3指纹
不同于其他的纯 Python http 客户端,比如
httpx 和 requests,这个库可以模拟浏览器的 TLS 或者 JA3 指纹。如果你莫名其妙地被某个网站封锁了,可以来试试这个库。TLS/JA3指纹是用于识别应用程序所使用的TLS实现和配置的方法。
JA3(Joint Authentication of Named Requirements)是由Salesforce在2016年提出的一个方法,它可以通过提取TLS客户端hello消息中的特定字段来创建TLS客户端的唯一指纹。这些字段包括:
SSL版本(比如TLS 1.2)
支持的加密套件列表
支持的压缩方法列表
TLS扩展(比如supports elliptic curves)
通过提取这些信息生成一个hash字符串,就可以唯一识别一个TLS客户端的配置信息。
举例来说,Mozilla Firefox和Google Chrome对TLS的实现和支持的加密套件是不一样的,通过JA3可以生成它们唯一的TLS指纹,这样就可以区分这两个浏览器的流量。
JA3指纹可以用于不同的安全场景:
识别并阻止特定恶意软件的流量,这些软件使用了唯一的TLS配置
检测异地登录,如果用户的JA3指纹突然变化,可能是账户被盗用
识别使用了弱加密套件的客户端等
总之,JA3指纹提供了通过TLS握手本身提取应用签名的方法,使安全分析人员可以明确识别并了解encrypted TLS流量,是TLS分析的重要技术之一。
Python中实现TLS/JA3发起请求
安装
pip install curl_cffi --upgrade
使用
类 requests
from curl_cffi import requests
# 注意 impersonate 这个参数
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome110")
print(r.json())
# output: {..., "ja3n_hash": "aa56c057ad164ec4fdcb7a5a283be9fc", ...}
# ja3n 指纹和目标浏览器一致
# 支持使用代理
proxies = {"https": "http://localhost:3128"}
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome110", proxies=proxies)
proxies = {"https": "socks://localhost:3128"}
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome110", proxies=proxies)Sessions
# sessions are supported
s = requests.Session()
# httpbin is a http test website
s.get("https://httpbin.org/cookies/set/foo/bar")
print(s.cookies)
# <Cookies[<Cookie foo=bar for httpbin.org />]>
r = s.get("https://httpbin.org/cookies")
print(r.json())
# {'cookies': {'foo': 'bar'}}更多并发:
import asyncio
from curl_cffi.requests import AsyncSession
urls = [
"https://googel.com/",
"https://facebook.com/",
"https://twitter.com/",
]
async with AsyncSession() as s:
tasks = []
for url in urls:
task = s.get("https://example.com")
tasks.append(task)
results = await asyncio.gather(*tasks)有关使用上的问题,欢迎您在底部评论区留言,一起交流~
读者评论
评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。
暂无评论,欢迎抢沙发。