JA4H, JA4T и JA4L переносят TLS-фингерпринтинг на HTTP-запросы, TCP-рукопожатие и задержку. Как устроен каждый и почему важны расхождения между ними.
Статья «TLS-фингерпринтинг» рассказывает про JA3 и JA4 — отпечаток, снимаемый с одного TLS ClientHello. Но JA4 никогда не задумывался как самостоятельный инструмент. Его автор, компания FoxIO, публикует его как часть более широкого семейства под названием JA4+, и большинство участников этого семейства снимают отпечатки с того, что к TLS вообще не относится: сам HTTP-запрос, лежащее под ним TCP-рукопожатие и даже то, сколько времени пакеты идут между клиентом и сервером. Каждый уровень читается независимо, и, как вы увидите ниже, настоящая сила проявляется именно тогда, когда уровни начинают противоречить друг другу.
Ключевые выводы
- JA4+ — это набор, а не один отпечаток. JA4 покрывает TLS ClientHello; JA4H снимает отпечаток с HTTP-запроса, JA4T — с TCP-рукопожатия, JA4L — с задержки соединения; каждый читает свой, независимый уровень одного и того же соединения.
- Уровни ортогональны, и в этом весь смысл. User-Agent и TLS-отпечаток, говорящие «Chrome на Windows», в паре с TCP-отпечатком, говорящим «ядро Linux», — классический признак прокси или антидетект-браузера, который не поймать ни на одном уровне в отдельности.
- JA4T читает SYN-пакет ещё до какого-либо шифрования. Размер окна, порядок TCP-опций, MSS и коэффициент масштабирования окна берутся из сетевого стека ОС, поэтому JA4T на самом деле идентифицирует именно ядро — тот же сигнал, что описан в статье «TCP/IP-фингерпринтинг»; JA4T просто оформляет его в структурированную, сортируемую строку.
- Формат намеренно сделан читаемым для человека. В отличие от непрозрачного MD5-хеша JA3, каждый отпечаток JA4+ имеет секционную структуру
a_b_cс читаемым префиксом, который можно частично расшифровать на глаз; кроме того, аналитик может сопоставлять лишь часть строки, не требуя совпадения целиком. - Лицензирование разделено. Сам JA4 распространяется по открытой лицензии BSD 3-Clause, и FoxIO заявляет, что не будет его патентовать. JA4H, JA4T, JA4L и остальные участники набора «+» находятся в процессе патентования и выпущены под лицензией FoxIO License 1.1: академическое и внутреннее корпоративное использование разрешено, но для продажи в составе продукта или хостингового сервиса нужна OEM-лицензия.
- Ничего из этого не видно клиентскому JavaScript. JA4+ вычисляется сервером, CDN-узлом или сетевым устройством, читающим сырые пакеты, — клиентский инструмент вроде нашей проверки отпечатка не может показать вам ваш собственный JA4H или JA4T, потому что браузер попросту не видит пакеты, которые сам только что отправил.
Краткое напоминание: JA4 (TLS)
Статья «TLS-фингерпринтинг» разбирает это подробно, здесь — версия в три предложения. Каждое HTTPS-соединение начинается с открытого ClientHello, перечисляющего наборы шифров, расширения и эллиптические кривые в порядке, заданном TLS-библиотекой клиента, а не пользователем. JA4 сортирует эти значения, отбрасывает шум GREASE и хеширует остаток в отпечаток вроде t13d1517h2_8daaf6152771_cb7bf5808d99 — стабильный между сессиями, с читаемым префиксом и специфичный для конкретной TLS-библиотеки. Всё, что описано ниже, читает другой уровень того же соединения.
JA4H: отпечаток HTTP-запроса
JA4H читает сам HTTP-запрос, отправленный клиентом, — не содержимое тела, а форму запроса (в случае HTTPS это делает тот, кто терминирует TLS: сам сервер или CDN перед ним). Согласно спецификации JA4H от FoxIO, читаемый префикс отпечатка кодирует метод запроса (первые две буквы в нижнем регистре — ge для GET, po для POST), версию HTTP (11 для HTTP/1.1, 20 для HTTP/2), наличие заголовка Cookie (c/n), наличие заголовка Referer (r/n), двузначное число заголовков (без учёта Cookie и Referer) и первые четыре символа значения Accept-Language (enus для en-US или 0000, если заголовка нет). За префиксом следуют короткие хеши имён заголовков в порядке отправки, имён полей cookie и имён cookie вместе со значениями. Хеш имён cookie обычно одинаков у всех посетителей конкретного сайта, а хеш имён со значениями у каждого пользователя свой.
Реальный пример из опубликованной FoxIO таблицы отпечатков: дроппер вредоносного ПО IcedID даёт JA4H=ge11cn020000_9ed1ff1f7b03_cd8dafe26982. В расшифровке это GET-запрос по HTTP/1.1 с cookie, без referer, всего с двумя другими заголовками и вообще без Accept-Language (завершающие 0000). Обе детали бросаются в глаза. Настоящие браузеры обычно отправляют десять и более заголовков в стабильном, характерном для конкретного браузера порядке, и именно этот порядок хеширует второй сегмент; а FoxIO отмечает, что отсутствие Accept-Language — сильный признак того, что клиентом управляет не человек через браузер. Это та же идея, что и сигналы порядка заголовков из статьи о HTTP/2-соединениях, только применённая в общем виде, а не к одной версии протокола. Если вы сравниваете отпечатки во времени, учтите одно недавнее изменение: исправление от 27 августа 2026 года заставило Rust-реализацию FoxIO исключать из JA4H собственные псевдозаголовки HTTP/2 (:method, :path, :scheme, :authority), поскольку они предписаны протоколом, а не выбраны клиентом, — так что HTTP/2-отпечатки этого инструмента до и после исправления не совпадут.
JA4T: отпечаток TCP-рукопожатия
JA4T читает SYN-пакет, открывающий TCP-соединение, — тот же уровень, что описан в статье «TCP/IP-фингерпринтинг», только упакованный в структурированный формат JA4 от FoxIO вместо сигнатурного сопоставления в духе p0f. Он собирает четыре значения из TCP-заголовка: заявленный размер окна, TCP-опции в том порядке, в котором их отправил стек (по их числовому коду типа — 2 для MSS, 1 для заполнения NOP, 3 для масштабирования окна, 4 для SACK-permitted, 8 для временных меток), максимальный размер сегмента и коэффициент масштабирования окна.
Пример от FoxIO для клиента Windows 11: JA4T=64240_2-1-3-1-1-4_1460_8 — окно в 64240 байт, опции в порядке MSS–NOP–масштабирование окна–NOP–NOP–SACK-permitted, MSS 1460 и коэффициент масштабирования окна 8. Всё это никак не зависит от TLS, HTTP или заголовка User-Agent — это пишет ядро операционной системы ещё до того, как браузер отправил хоть один зашифрованный байт. Мелочи здесь очень информативны: FoxIO отмечает, что Windows не отправляет опцию временных меток (8), а Unix-подобные стеки отправляют, поэтому само её отсутствие в примере выше выдаёт Windows. Поле MSS говорит не только об ОС, но и о сетевом пути. MSS 1460 получается при стандартном для Ethernet MTU в 1500 байт; более низкое значение, например 1380, указывает на накладные расходы шифрования или туннелирования, а Unix-подобный отпечаток с MSS 1424 — это 36 байт лишних накладных расходов — FoxIO описывает как возможный нешифрованный туннель или прокси. Что касается инструментов, исправление от 27 августа 2026 года привело формат числовых полей в Rust-реализации FoxIO в соответствие с её же реализациями для Wireshark и Zeek — это важно, если вы сравниваете строки JA4T, полученные разными инструментами.
JA4L: отпечаток задержки
JA4L — особый участник семейства: он снимает отпечаток не с поля протокола, а со времени рукопожатия. Обозначим три пакета TCP-рукопожатия как A (SYN), B (SYN-ACK) и C (ACK); время каждого фиксирует точка наблюдения. FoxIO определяет JA4L-C как (C − B) / 2 — оценку односторонней задержки от точки наблюдения до клиента — и JA4L-S как (B − A) / 2 — такую же оценку в сторону сервера. Обе величины измеряются в микросекундах и дополняются TTL, наблюдаемым в пакетах соответствующей стороны. Датчик рядом с сервером получит осмысленный JA4L-C и почти нулевой JA4L-S, и наоборот. Поскольку JA4L читает только тайминги пакетов и IP-заголовки, он работает независимо от того, зашифрован трафик или нет.
Обе величины имеют физический смысл. Сигнал в оптоволокне не может обогнать свет — FoxIO берёт примерно 0,128 мили (около 0,2 км) за микросекунду с поправочным коэффициентом задержки распространения на реальную маршрутизацию, — поэтому показатель задержки задаёт верхнюю границу физического расстояния до другой стороны; именно поэтому FoxIO подаёт JA4L как измерение не только задержки, но и местоположения. TTL даёт вторую подсказку: операционные системы начинают с разных начальных значений (обычно 64 у Linux и macOS, 128 у Windows), так что наблюдаемый TTL намекает и на число хопов, и на семейство ОС отправителя — ещё одно поле, способное незаметно противоречить User-Agent.
Это делает JA4L перекрёстной проверкой заявлений о местоположении. Если IP-адрес соединения геолоцируется на другом континенте, а рукопожатие завершается за одну-две миллисекунды, что-то не так: машина, завершившая рукопожатие, физически находится рядом, что бы ни говорила база IP-адресов. Обратный случай — более слабое свидетельство, но тоже полезное: VPN третьего уровня пересылает собственные пакеты рукопожатия клиента из конца в конец, поэтому задержка включает скрытый участок до реального пользователя, и показатель, намного превышающий то, что объясняется расположением выходного IP, намекает, что клиент дальше, чем кажется. (Задержку может раздуть и перегрузка сети, поэтому невозможно низкий показатель — более сильный сигнал.)
Остальные участники набора: JA4X, JA4SSH и другие
Ещё нескольких участников стоит знать по именам, даже если они напрямую не касаются повседневных забот аудитории, интересующейся приватностью браузера. JA4X снимает отпечаток с сертификатов X.509, которые предъявляет TLS-сервер (а в схемах со взаимной TLS-аутентификацией — и клиент), причём, как подчёркивает FoxIO, фиксирует то, как сертификат был сгенерирован, а не значения внутри него. Поэтому сертификаты, выпущенные одним и тем же инструментарием, группируются вместе, даже если имена и ключи в них разные, — это полезно для отслеживания инфраструктуры управления (C2) вредоносного ПО между кампаниями. JA4SSH применяет ту же идею к SSH: он описывает зашифрованную сессию в скользящем окне (по умолчанию каждые 200 пакетов) по длинам и количеству пакетов и паттернам ACK — этого хватает, чтобы без расшифровки отличить интерактивную оболочку от передачи файлов или обратной оболочки (reverse shell). Остальной состав охватывает серверную сторону и другие протоколы: JA4S (ответ TLS ServerHello), JA4TS (TCP SYN-ACK сервера), JA4TScan (активный TCP-сканер) и JA4D (DHCP). Ни один из них не касается браузера напрямую, но все следуют той же философии, что и JA4H/T/L: снимать отпечаток с того, что структурно стабильно у клиента, независимо от того, кем он себя называет.
Почему расхождение между уровнями — это и есть суть
Каждый отпечаток, о котором шла речь на этом сайте до сих пор — canvas, WebGL, TLS, — отвечает на вопрос «что говорит об этом клиенте один конкретный сигнал». Настоящий вклад JA4+ в том, что он превращает это в перекрёстную проверку: прочитать несколько независимых уровней одного и того же соединения и посмотреть, рассказывают ли они одну и ту же историю.
Пример из практики: скрапер работает на Linux-сервере, отправляет User-Agent Chrome для Windows и настраивает библиотеку имитации TLS так, чтобы его JA4 в точности совпадал с Chrome. Этого достаточно, чтобы обмануть проверку, которая смотрит только на TLS. Но ядро того же сервера всё равно само пишет свой TCP SYN-пакет — JA4T читает размер окна, порядок опций и MSS Linux, которые библиотека имитации не трогает, поскольку она работает выше сетевого стека ОС. Система обнаружения, логирующая оба отпечатка, видит запрос, выдающий себя за Chrome на Windows, но пришедший через TCP-рукопожатие, явно принадлежащее Linux, — и это противоречие устранить куда сложнее, чем любой отпечаток по отдельности: нужно одновременно контролировать библиотеку имитации, ядро с его TCP-стеком и порядок заголовков HTTP-клиента, а не проконтролируешь один из уровней — несоответствие проявится именно в нём. Это тот же принцип составных слоёв, что описан в статье «Методы обнаружения ботов» и в статье о том, как JA3/JA4 сочетаются с TCP/IP-фингерпринтингом: несоответствие между наблюдаемыми уровнями — более весомое доказательство, чем любая единичная аномалия.
Читаемость формата: почему строки JA4+ читаемы
Вывод JA3 представлял собой один непрозрачный MD5-хеш — удобный для точного сопоставления, но бесполезный при беглом взгляде на строку лога. FoxIO спроектировала каждый отпечаток JA4+ вокруг намеренно читаемой структуры a_b_c: расшифровываемый в открытом виде префикс (метод, версия, счётчики, флаги), за которым следует один или несколько коротких хешей для тех частей, что слишком детализированы, чтобы выписывать их буквально. Эта читаемость не косметическая. В README FoxIO сказано, что формат позволяет вести охоту на угрозы и обнаружение, используя только ab, ac или только c: например, аналитик может сопоставлять читаемый префикс вместе с одним из хешей, игнорируя другой.
Есть и практическая польза: поскольку формат специфицирован, а не восстановлен обратной разработкой, сторонние разработчики могут создавать совместимые реализации. В README FoxIO перечислены инструменты и сервисы с нативной поддержкой, включая Suricata, Arkime, ntopng, Cloudflare, AWS CloudFront и WAF, а также Google Cloud Armor; Wireshark и Zeek получают поддержку через плагины из референсного репозитория FoxIO. Совместимость держится, только если все реализации выдают побайтово одинаковые строки, а это требует постоянной работы: 27 августа 2026 года FoxIO в один день влила два исправления корректности — числовые поля JA4T в Rust-реализации были выровнены с выводом Wireshark и Zeek, а Rust-отпечаток JA4H перестал учитывать псевдозаголовки HTTP/2. Это напоминание: любое описание точного формата этих отпечатков актуально лишь для той версии реализации, на которую оно опирается.
Лицензирование: почему экосистема разделена
Сам JA4 — клиентский TLS-отпечаток — выпущен по лицензии BSD 3-Clause, на тех же условиях, что и в своё время JA3, а FoxIO заявляет, что не имеет на него патентных притязаний и не будет их добиваться. Все остальные участники набора (JA4S, JA4H, JA4L, JA4X, JA4SSH, JA4T и прочие) находятся в процессе патентования и распространяются по лицензии FoxIO License 1.1: она разрешает академическое и внутреннее корпоративное использование, но для монетизации этих методов в продукте или хостинговом сервисе нужна OEM-лицензия. Это одна из причин, по которым некоторые инструменты и сервисы реализуют только JA4 и пропускают остальную часть набора, — решение не только техническое, но и лицензионное.
Что вы реально можете с этим сделать
Ничего из JA4H, JA4T и JA4L не читается клиентским JavaScript. Все три вычисляются по мере поступления трафика — из TCP-заголовков и таймингов рукопожатия, а также из HTTP-запроса после терминации TLS — тем, кто находится на сетевом пути: сервером, CDN-узлом или устройством мониторинга. Поэтому наш собственный инструмент проверки отпечатка, как и любая чисто клиентская демонстрация фингерпринтинга, не может показать вам ваши строки JA4H или JA4T: браузер не видит пакеты, которые операционная система только что отправила от его имени.
Что можно сделать:
- Посмотреть свой JA4 на уровне TLS в реальном времени. На странице о TLS-фингерпринтинге показаны версия TLS, набор шифров и — если доступно — хеш JA4, которые наш edge-узел увидел в вашем текущем соединении.
- Проверить браузерную половину перекрёстной проверки. Наш тест на ботов ищет следы автоматизации и утечки headless-браузера, а проверка отпечатка показывает сигналы canvas, WebGL и шрифтов, которые сайт может сопоставить с сетевыми отпечатками.
- Снять остальное самостоятельно. Запишите свой трафик в Wireshark с плагином JA4+ от FoxIO, чтобы увидеть JA4T и JA4L. JA4H требует HTTP-запроса в открытом виде, поэтому появится только для нешифрованного HTTP, если только вы не настроите в Wireshark расшифровку TLS.
Где проходит граница с другими статьями на этом сайте
- «TLS-фингерпринтинг» разбирает JA3/JA4 на самом ClientHello — этот слой предполагается известным как фон для данной статьи.
- «TCP/IP-фингерпринтинг» разбирает обнаружение ОС по заголовкам IP/TCP в общем виде, независимо от названия и формата JA4T.
- «HTTP/2-фингерпринтинг» разбирает отпечаток Akamai — значения SETTINGS, порядок псевдозаголовков — другую сигнатуру HTTP-уровня, отличную от JA4H.
- «HTTP/3 и QUIC-фингерпринтинг» разбирает собственный отпечаток транспортных параметров QUIC.
- «Постквантовый TLS» разбирает, как обмен ключами ML-KEM меняет размер и поля ClientHello.
- «Как обнаружить подмену User-Agent» разбирает тот же принцип межуровневого несоответствия со стороны User-Agent.
Эта статья посвящена конкретно семейству JA4+ как единому набору и тому, почему полезно читать его уровни вместе — а не любой из них по отдельности.
Часто задаваемые вопросы
JA4H — это то же самое, что фингерпринтинг по порядку HTTP-заголовков?
Тесно связано, но не идентично. JA4H — это конкретный, стандартизированный формат от FoxIO для фингерпринтинга HTTP-запросов: чётко определённый префикс плюс хешированные сегменты, опубликованные для того, чтобы разные инструменты могли получать и сравнивать одну и ту же строку. «Фингерпринтинг по порядку HTTP-заголовков» — более общая техника, на которой он основан; другие инструменты и системы обнаружения вычисляют похожие сигналы в собственных, несовместимых друг с другом форматах.
Меняет ли VPN мой отпечаток JA4T?
Отчасти — и всё зависит от того, VPN это или прокси. Полнотуннельный VPN (WireGuard, OpenVPN, IPsec) пересылает TCP-пакеты, которые формирует ваша собственная ОС, поэтому размер окна, порядок опций и масштабирование окна в JA4T по-прежнему описывают ваше ядро. Обычно меняется MSS: накладные расходы инкапсуляции опускают его ниже 1460, типичных для обычного Ethernet-подключения, и FoxIO приводит значения вроде 1380 как признак шифрования или туннелирования. Прокси устроен иначе — он открывает к сайту собственное TCP-соединение, поэтому JA4T описывает ОС прокси-сервера, а не вашу. В любом случае JA4T, похожий на туннель или на Linux-сервер в дата-центре, в паре с TLS-отпечатком обычного потребительского браузера — один из сигналов, описанных в статье «Как сайты определяют VPN и прокси».
Можно ли где-то посмотреть свои собственные отпечатки семейства JA4?
Свой актуальный отпечаток JA4 (TLS) вы можете увидеть на странице TLS-фингерпринтинга этого сайта, поскольку этот показатель вычисляется на сервере из вашего соединения и отображается вам обратно. Для JA4H, JA4T и JA4L нужен инструмент, читающий сырые пакеты или полные HTTP-запросы, — их нельзя вывести через простой клиентский виджет, как отпечаток TLS-рукопожатия.
Почему компания стала бы платить за лицензию JA4+, если можно просто пользоваться JA3?
Потому что дизайн JA4+ решает реальные проблемы JA3 — устойчивость к GREASE, сортируемый и читаемый вывод, а также охват уровней, которых JA3 никогда не касался, — и эта ценность достаточно велика, чтобы вокруг неё строили продукты вендоры безопасности. FoxIO License 1.1 и так бесплатно разрешает академическое и внутреннее корпоративное использование; OEM-лицензия нужна только тогда, когда компания монетизирует методы JA4+ в продукте или хостинговом сервисе. Сам JA4 остаётся под лицензией BSD, так что вендору, которому нужен только TLS-отпечаток, лицензия не нужна вовсе.


