TLS指纹-JA3

# 官方解释

TLS 及其前身 SSL 用于为常见应用程序和恶意软件加密通信,以确保数据安全,因此可以隐藏在噪音中。要启动 TLS 会话,客户端将在 TCP 3 次握手之后发送 TLS 客户端 Hello 数据包。此数据包及其生成方式取决于构建客户端应用程序时使用的包和方法。服务器如果接受 TLS 连接,将使用基于服务器端库和配置以及 Client Hello 中的详细信息制定的 TLS Server Hello 数据包进行响应。由于 TLS 协商以明文形式传输,因此可以使用 TLS Client Hello 数据包中的详细信息来指纹和识别客户端应用程序。
官方介绍 | JA3 指纹

# JA3 原理

JA3 收集以下字段的字节的十进制值;SSL 版本、接受的密码、扩展列表、椭圆曲线和椭圆曲线格式。然后,它按顺序将这些值连接在一起,使用 “,” 分隔每个字段,使用 “-” 分隔每个字段中的每个值。
0_QZ7tsC7MAET5lbLP.webp
字段顺序如下:
SSLVersion,密码,扩展,椭圆曲线,椭圆曲线点格式
例:

1
769,47–53–5–10–49161–49162–49171–49172–50–56–19–4,0–10–11,23–24–25,0

如果客户端 Hello 中没有 SSL 扩展,则字段留空。
例:

1
769,4–5–10–9–100–98–3–6–19–18–99,,,

然后对这些字符串进行 MD5 哈希处理,以生成易于使用和共享的 32 个字符的指纹。这是 JA3 SSL 客户端指纹。

1
2
769,47–53–5–10–49161–49162–49171–49172–50–56–19–4,0–10–11,23–24–25,0 → ada70206e40642a3e4461f35503241d5769,4–5–10–9–100–98–3–6–19–18–99,,,
→ de350869b8c85de67a350c8d186f11e6

我们还需要引入一些代码来解释 Google 的 GREASE(生成随机扩展和维持可扩展性),如此处所述。Google 将此用作防止 TLS 生态系统中扩展性失败的机制。JA3 完全忽略这些值,以确保使用 GREASE 的程序仍可以使用单个 JA3 哈希进行标识。

# TLS 检测判断

# TLS 检测原理

抓包工具 wireshark、charles 只能查看 TLS 指纹,不能以此判断服务器检测了 TLS。

在 HTTPS 协议中,TLS 协议是用来在客户端和服务器之间建立安全连接的,这个连接过程中就会生成 TLS 指纹。只要是 HTTPS 协议,必定会生成 TLS 指纹。
检测 TLS 是在服务端进行的,唯一判断是否检测 TLS 的手段就是测试猜测

# 未检测 TLS

  • 验证请求头顺序
  • 检测 HTTP2.0
  • curl 生成 code 可直接访问

# 检测了 TLS

  • curl、api 调试工具、js 有可响应的就 python 不行。
  • curl、js 都不行就浏览器可以。

# 过校验示例

python 的 aiohttp | requests | httpx | scrapy 和 golang 相关的 ja3 指纹修改案例。
image.png
笔者整理的一些案例:
JA3 指纹(go/python)点击下载