Notion Blog
技术分享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 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。