TLS-отпечаток
Уже в самом первом пакете HTTPS-соединения (ClientHello) браузер перечисляет поддерживаемые наборы шифров, расширения и эллиптические кривые. Хэш этих полей дает JA3 / JA4; кадр SETTINGS, открывающий HTTP/2-соединение, можно снять таким же образом. Все это происходит до выполнения любого JavaScript, и смена UA ничего здесь не меняет.
- JA4
- Хэш JA3
- Строка JA3
- Отпечаток HTTP/2
- Версия TLS
- Источник
- Наблюдалось на
- Браузер по разбору сервера
- Встречался здесь раз
- Впервые замечен
- Наблюдений этого JA4
- Доля того же семейства браузеров
- Браузеры с этим JA4
JA3 (Salesforce, 2017) склеивает версию TLS, наборы шифров, расширения, кривые и форматы точек в исходном порядке и берет MD5 — переставьте что угодно, и хэш изменится. Начиная с Chrome 110 порядок расширений перемешивается при каждом соединении, поэтому JA3 одного и того же Chrome почти каждый раз разный. JA4 (FoxIO, 2023) сортирует перед хэшированием (усеченный SHA-256) и выносит версию TLS, SNI, ALPN и счетчики в читаемый префикс вроде t13d1516h2, что делает его очень стабильным внутри семейства браузеров: у всех браузеров на Chromium (Chrome, Edge, Brave…) один JA4, у Firefox и Safari — свои. Сайты сравнивают JA4 с UA: UA, заявляющий Firefox при рукопожатии, похожем на Chrome, — это инструмент автоматизации или антидетект-браузер с подмененным UA; этот сайт делает то же сравнение по собственной статистике JA4 ↔ семейство браузеров. Чтобы вообще увидеть отпечаток, сервер должен сам завершать TLS: на хосте за прокси Cloudflare (оранжевое облако) рукопожатие происходит на границе Cloudflare, и источник видит только отпечаток самого Cloudflare (JA4 Cloudflare отдает только клиентам Enterprise). Поэтому fingerproxy работает на отдельном хосте только с DNS (серое облако), к которому браузер один раз обращается cross-origin; если этот эндпоинт недоступен, используется сторонний check.ja3.zone, который дает только JA3.