目录
TLS 指纹
TLS 指纹又叫 SSL 指纹,或者 JA3 指纹,是根据客户端向服务端发送的 Client Hello 计算得到
在 TLS 握手中还有服务端响应的 Server Hello,也有特征,可以得到 JA3S 指纹
又由于服务端会根据不同的 Client Hello 响应不同的 Server Hello,根据这个又可以得到 JARM 指纹。
测试
测试网站:https://ja3er.com/
工具测试
curl in win
C:\Users\xxx>curl https://ja3er.com/json
{"ja3_hash":"bd0bf25947d4a37404f0424edf4db9ad", "ja3": "771,49196-49195-49200-49199-159-158-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10,0-5-10-11-13-35-16-23-65281,29-23-24,0", "User-Agent": "curl/7.79.1"}
C:\Users\xxx>curl https://ja3er.com/json --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
{"ja3_hash":"bd0bf25947d4a37404f0424edf4db9ad", "ja3": "771,49196-49195-49200-49199-159-158-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10,0-5-10-11-13-35-16-23-65281,29-23-24,0", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"}
curl in linux
xxx:~
{"ja3_hash":"535886c8d0a1b14f02298967bb990171", "ja3": "771,4866-4867-4865-49196-49200-159-52393-52392-52394-49195-49199-158-49188-49192-107-49187-49191-103-49162-49172-57-49161-49171-51-157-156-61-60-53-47-255,0-11-10-13172-16-22-23-13-43-45-51-21,29-23-1035-25-24,0-1-2", "User-Agent": "curl/7.58.0"}
xxx:~
{"ja3_hash":"535886c8d0a1b14f02298967bb990171", "ja3": "771,4866-4867-4865-49196-49200-159-52393-52392-52394-49195-49199-158-49188-49192-107-49187-49191-103-49162-49172-57-49161-49171-51-157-156-61-60-53-47-255,0-11-10-13172-16-22-23-13-43-45-51-21,29-23-1035-25-24,0-1-2", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"}root@racknerd-b3b9b8:~
php-curl
<?php
$url = 'https://ja3er.com/json';
$headerArray =array("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
echo $output;
{"ja3_hash":"eaa1a9e1db47ffcca16305566a6efba4", "ja3": "771,4866-4867-4865-49196-49200-159-52393-52392-52394-49195-49199-158-49188-49192-107-49187-49191-103-49162-49172-57-49161-49171-51-157-156-61-60-53-47-255,0-11-10-13172-16-22-23-49-13-43-45-51-21,29-23-1035-25-24,0-1-2", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"}
{"ja3_hash":"eaa1a9e1db47ffcca16305566a6efba4", "ja3": "771,4866-4867-4865-49196-49200-159-52393-52392-52394-49195-49199-158-49188-49192-107-49187-49191-103-49162-49172-57-49161-49171-51-157-156-61-60-53-47-255,0-11-10-13172-16-22-23-49-13-43-45-51-21,29-23-1035-25-24,0-1-2", "User-Agent": "a"}
workerman/http-client
{"ja3_hash":"9fb84870b64a8d7e3ef018c726b80b4b", "ja3": "771,4866-4867-4865-49199-49195-49200-49196-158-162-163-159-49191-49187-49171-49161-49192-49188-49172-49162-103-51-64-107-56-57-156-157-49326-49324-49314-49310-50-49312-49308-60-47-49327-49325-49315-49311-106-49313-49309-61-53-52393-52392-52394-49245-49249-49239-49235-49244-49248-49238-49234-49267-49271-196-195-49266-49270-190-189-136-135-69-68-49233-49232-192-186-132-65-255,0-11-10-35-22-23-13-43-45-51-21,29-23-1035-25-24,0-1-2", "User-Agent": "workerman/http-client"}
{"ja3_hash":"9fb84870b64a8d7e3ef018c726b80b4b", "ja3": "771,4866-4867-4865-49199-49195-49200-49196-158-162-163-159-49191-49187-49171-49161-49192-49188-49172-49162-103-51-64-107-56-57-156-157-49326-49324-49314-49310-50-49312-49308-60-47-49327-49325-49315-49311-106-49313-49309-61-53-52393-52392-52394-49245-49249-49239-49235-49244-49248-49238-49234-49267-49271-196-195-49266-49270-190-189-136-135-69-68-49233-49232-192-186-132-65-255,0-11-10-35-22-23-13-43-45-51-21,29-23-1035-25-24,0-1-2", "User-Agent": "workerman/http-client, Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"}
小结
- 同个工具更改USERAGENT没有影响的
- 每个工具在不修改请求配置下,指纹是保持不变的。
- php中curl和stream模拟请求时,指纹时不同的
不同php 版本
php-curl 不同php 版本
{"ja3_hash":"5354183c5c43b8cd5bb66e72af4c4967", "ja3": "771,49200-49196-49192-49188-49172-49162-165-163-161-159-107-106-105-104-57-56-55-54-136-135-134-133-49202-49198-49194-49190-49167-49157-157-61-53-132-49199-49195-49191-49187-49171-49161-164-162-160-158-103-64-63-62-51-50-49-48-154-153-152-151-69-68-67-66-49201-49197-49193-49189-49166-49156-156-60-47-150-65-7-49170-49160-22-19-16-13-49165-49155-10-
255,0-11-10-13-13172-16-21,23-25-28-27-24-26-22-14-13-11-12-9-10,0-1-2", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"}
{"ja3_hash":"eaa1a9e1db47ffcca16305566a6efba4", "ja3": "771,4866-4867-4865-49196-49200-159-52393-52392-52394-49195-49199-158-49188-49192-107-49187-49191-103-49162-49172-57-49161-49171-51-157-156-61-60-53-47-255,0-11-10-13172-16-22-23-49-13-43-45-51-21,29-23-1035-25-24,0-1-2", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.
36"}
workerman/http-client 不同php 版本
{"ja3_hash":"8f6003e7d70355641d21086588dabc29", "ja3": "770,49171-49161-49172-49162-51-56-57-50-49-48-49166-49156-47-55-54-49167-49157-53-136-135-134-133-132-69-68-67-66-65-255,0-11-10-35,23-25-28-27-24-26-22-14-13-11-12-9-10,0-1-2", "User-Agent": "ja3 test"}
{"ja3_hash":"217b3ba78c5a53197001d4730a7ccb1e", "ja3": "770,49171-49161-49172-49162-51-56-57-50-47-53-136-135-69-68-132-65-255,0-11-10-35-22-23,29-23-1035-25-24,0-1-2", "User-Agent": "ja3 test"}
小结
php版本会修改TLS指纹
修改加密方法
环境:win10+ php8 + workerman/http-client
方法:修改stream_socket_enable_crypto中的Type,对应的文件位置时:https://github.com/walkor/workerman/blob/master/Connection/TcpConnection.php#L734
默认配置
$type = \STREAM_CRYPTO_METHOD_SSLv2_CLIENT | \STREAM_CRYPTO_METHOD_SSLv23_CLIENT;
{"ja3_hash":"0a6b3cdcc29ee2ed7372388c24fae51d", "ja3": "771,49199-49195-49200-49196-158-162-163-159-49191-49187-49171-49161-49192-49188-49172-49162-103-51-64-107-56-57-156-157-49326-49324-49314-49310-50-49312-49308-60-47-49327-49325-49315-49311-106-49313-49309-61-53-52393-52392-52394-49245-49249-49239-49235-49244-49248-49238-49234-49267-49271-196-195-49266-49270-190-189-136-135-69-68-49233-49232-192-18
6-132-65-255,0-11-10-35-22-23-13-21,29-23-1035-25-24,0-1-2", "User-Agent": "ja3 test"}
替换加密方式
加密选项可见stream_socket_enable_crypto
$type = \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT;
{"ja3_hash":"a533ec7d2ba4e1005895ad80ce52fa03", "ja3": "769,49171-49161-49172-49162-51-56-57-50-47-53-136-135-69-68-132-65-255,0-11-10-35-22-23,29-23-1035-25-24,0-1-2", "User-Agent": "ja3 test"}
修改顺序(废弃)
好吧,测试是没有变化。但是后续发现配置用或的形式, 修改顺序时无意义的。也就是说无法修改顺序。
小结
修改TLS加密配置可以改变指纹。
结论
有代表性,但可以被篡改。在防护方面只作为一个判断参考,如果是在浏览器上,结合其他指纹搭配,可以提高辨识度。
可挡住的用户:
- 面对短时间内的使用工具发起的大量请求,使用TLS指纹可以有很好的效果。
- 使用的工具无法灵活的修改配置
- 对于该技术并不了解的人
其他人的评价:
- JARM仅仅是一种TLS服务端特征的标识方式,不能完全被用作Web上层应用的唯一指纹。
- 一定程度上来说确实能防止一些特定语言和客户端的爬虫和扫描工具,尤其是脚本小子们
其他
今天并没有对代理工具进行测试,如果有兴趣的可以自行测试。但个人感觉代理作用 有限,修改后的代理机器指纹,如果代理服务商的工具一致,那指纹有可能也是一致的,主要还是要看代理服务商是否又在这方面做考虑。
参考
tls-fingerprinting
TLS Fingerprinting with JA3 and JA3S
SSL 指纹识别和绕过
利用JARM指纹进行TLS服务端标记
反制爬虫之 Burp Suite RCE