# TLS 指纹

大多数现代网站现已普遍采用 HTTPS,其建立过程涉及服务器与客户端之间进行 TLS 握手。在此握手阶段,双方会相互交换支持的 TLS 版本、加密算法等关键信息。鉴于不同客户端之间存在显著差异,且这些信息通常较为固定,服务器能够利用 TLS 握手的特征数据来区分请求类型,判断是常规用户的浏览器访问还是来自如 Python 等脚本的自动化访问工具。

JA3 是生成 TLS 指纹的一个常用算法。它的工作原理如下:

  1. 收集客户端特征

a. 在解析 TLS 握手客户端发送的 ClientHello 报文中获取 SSLVersion 版本、Cipher 客户端支持的加密套件、SSLExtention SSL的扩展内容集合、 EllipticCurve SSL的扩展内容里面的【supported_groups】(CurveP256,CurveP384,CurveP521,X25519)、 EllipticCurvePointFormat SSL的扩展参数里面的【sec_point_formats】(uncompressed,ansiX962_compressed_prime,ansiX962_compressed_char2)

SSLVersion,Cipher,SSLExtension,EllipticCurve,EllipticCurvePointFormat
  1. 特征举例
769,47-53-5-10-49161-49162-49171-49172-50-56-19-4,0-10-11,23-24-25,0

该特征值可以通过 Wireshark 抓包获取

  1. 对特征值进行哈希运算,产生 32 位长度的哈希值
769,47-53-5-10-49161-49162-49171-49172-50-56-19-4,0-10-11,23-24-25,0 --> ada70206e40642a3e4461f35503241d5
769,4-5-10-9-100-98-3-6-19-18-99,,, --> de350869b8c85de67a350c8d186f11e6
  1. 和已知的哈希值进行对比判断是否为爬虫

a. 如将常见的爬取工具(curl、wget、urllib、httpx、requests、golang)的指纹加入黑名单,从而屏蔽相关爬虫。 b. 将浏览器的指纹加入白名单,防止误伤。 c. TLS 指纹可以用作反爬,但是也并非不可伪造(伪造成本高),必要时需要和其他指纹搭配使用。 d. 想要获取 TLS 指纹需要依赖网络设备或代理服务器或安全网关,应用层很难直接获取。

  1. 常见工具的指纹(通过 https://tls.browserleaks.com/json 获取的指纹)

curl

{
  "user_agent": "curl/8.1.2",
  "ja3_hash": "2bab0327a296230f9f6427341e716ea0",
  "ja3_text": "771,4866-4867-4865-49200-49196-49192-49188-49172-49162-159-107-57-52393-52392-52394-65413-196-136-129-157-61-53-192-132-49199-49195-49191-49187-49171-49161-158-103-51-190-69-156-60-47-186-65-49169-49159-5-4-49170-49160-22-10-255,43-51-0-11-10-13-16,29-23-24-25,0",
  "ja3n_hash": "89c23ef504c3cc9ccd6580643494edae",
  "ja3n_text": "771,4866-4867-4865-49200-49196-49192-49188-49172-49162-159-107-57-52393-52392-52394-65413-196-136-129-157-61-53-192-132-49199-49195-49191-49187-49171-49161-158-103-51-190-69-156-60-47-186-65-49169-49159-5-4-49170-49160-22-10-255,0-10-11-13-16-43-51,29-23-24-25,0",
  "akamai_hash": "64a832f547be33249bf4d33e8a46c5dc",
  "akamai_text": "3:100;4:10485760;2:0|1048510465|0|m,s,a,p"
}

wget

{
  "user_agent": "Wget/1.21.1",
  "ja3_hash": "b9c865e0f840d0946a3b80a0e142610c",
  "ja3_text": "771,4866-4867-4865-49196-49200-163-159-52393-52392-52394-49327-49325-49315-49311-49245-49249-49239-49235-49195-49199-162-158-49326-49324-49314-49310-49244-49248-49238-49234-49188-49192-107-106-49267-49271-196-195-49187-49191-103-64-49266-49270-190-189-49162-49172-57-56-136-135-49161-49171-51-50-69-68-157-49313-49309-49233-156-49312-49308-49232-61-192-60-186-53-132-47-65-255,0-11-10-35-22-23-49-13-43-45-51,29-23-30-25-24,0-1-2",
  "ja3n_hash": "0be23e71d7ae7d0c839040ef3ef66e19",
  "ja3n_text": "771,4866-4867-4865-49196-49200-163-159-52393-52392-52394-49327-49325-49315-49311-49245-49249-49239-49235-49195-49199-162-158-49326-49324-49314-49310-49244-49248-49238-49234-49188-49192-107-106-49267-49271-196-195-49187-49191-103-64-49266-49270-190-189-49162-49172-57-56-136-135-49161-49171-51-50-69-68-157-49313-49309-49233-156-49312-49308-49232-61-192-60-186-53-132-47-65-255,0-10-11-13-22-23-35-43-45-49-51,29-23-30-25-24,0-1-2",
  "akamai_hash": "",
  "akamai_text": ""
}

chrome


{
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
  "ja3_hash": "23a162006f0b85619ad19cb155e69511",
  "ja3_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,23-51-43-0-10-16-5-11-13-65281-18-27-17513-45-65037-35,29-23-24,0",
  "ja3n_hash": "473f0e7c0b6a0f7b049072f4e683068b",
  "ja3n_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-5-10-11-13-16-18-23-27-35-43-45-51-17513-65037-65281,29-23-24,0",
  "akamai_hash": "52d84b11737d980aef856699f885ca86",
  "akamai_text": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p"
}


Microsoft edge

{
    "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
    "ja3_hash": "f2c97279a85d68a652296450ecdb203d",
    "ja3_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,13-35-0-45-65037-18-11-10-51-65281-27-43-17513-5-16-23,29-23-24,0",
    "ja3n_hash": "473f0e7c0b6a0f7b049072f4e683068b",
    "ja3n_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-5-10-11-13-16-18-23-27-35-43-45-51-17513-65037-65281,29-23-24,0",
    "akamai_hash": "52d84b11737d980aef856699f885ca86",
    "akamai_text": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p"
}

目前主流的云服务商均支持基于 TLS 指纹的 WAF,比如:阿里云 、Akamai。

可以通过以下工具查看当前客户端的 TLS 指纹

  1. https://tls.browserleaks.com/json
  2. https://browserleaks.com/tls
  3. https://www.ssllabs.com/ssltest/viewMyClient.html
  4. Wireshark(获取特征值,需要自己去计算 TLS 指纹)

PS:不同网站服务端获取到的密码套件(Cipher Suites)不同,因此可能看到不同网站给出了不同的 TSL 指纹。

最后更新: Tue, 19 Mar 2024 16:55:04 GMT

0 评论

加载中...
访问量:-