Два представления до запуска любого скрипта
Всё, что пишут о браузерном фингерпринтинге, касается того, что страница может измерить: canvas, WebGL, шрифты, размер экрана. Всё это происходит уже после установления соединения.
К этому моменту ваш клиент уже сделал о себе два заявления, которые не отозвать. ClientHello в TLS сообщает, какие наборы шифров, расширения, эллиптические кривые и протоколы ALPN он поддерживает и в каком порядке. Преамбула HTTP/2 сообщает значения кадра SETTINGS, размер приращения окна и порядок, в котором отправляются псевдополя заголовков.
Ни то, ни другое не является утверждением о личности. И то и другое — следствие того, какая библиотека TLS и какой HTTP-стек были вкомпилированы в бинарник. Именно это и делает их ценными для поставщика систем обнаружения: строку user agent может набрать кто угодно, а ClientHello — это структура, из которой вы должны быть реально собраны.
JA3 и почему Chrome его сломал
JA3, опубликованный Salesforce в 2017 году, берёт пять полей из ClientHello — версию TLS, наборы шифров, расширения, эллиптические кривые и форматы кривых, — склеивает их в том порядке, в каком они идут по проводу, и считает MD5. Получается 32-символьный хеш, стабильный для конкретной сборки клиента.
Шесть лет это работало, а потом Chrome его добил. В Chrome 110, вышедшем в январе 2023 года, Google начал случайно перемешивать порядок TLS-расширений при каждом соединении — прямо заявив это как меру против окостенения протокола и против фингерпринтинга. Поскольку JA3 хеширует список расширений в порядке передачи, случайный порядок каждый раз даёт другой хеш. Chrome в одночасье перешёл от одного JA3 к практически неограниченному их числу.
Отсюда следствие, на которое в антидетект-среде не любили указывать: какое-то время стабильный JA3 сам по себе стал подозрительным, потому что у настоящего Chrome его больше не было.
JA4 и семейство JA4+
JA4, опубликованный FoxIO в 2023 году, решает проблему порядка очевидным способом: сортирует шифры и расширения перед хешированием. Перемешивайте порядок передачи сколько угодно — отсортированный список остаётся прежним, и отпечаток снова стабилен.
Он ещё и читаемый, а не непрозрачный. JA4 — это строка из 36 символов в трёх частях, и первая часть понятна человеку: протокол и версия TLS, наличие SNI, число шифров и расширений и значение ALPN. Взглянув на JA4, можно понять, что клиент предложил 15 шифров по TLS 1.3 с согласованным h2, ещё до того как искать хеш.
JA4 — основа более широкого семейства, и здесь важны два его родственника:
- JA4H снимает отпечаток самого HTTP-запроса: метод, версия, имена заголовков по порядку, наличие куки и значение
Accept-Language. Он ловит клиента, чьи заголовки не соответствуют браузеру, которым он себя называет. - JA4L измеряет задержку между шагами рукопожатия. Его подделать труднее всего, потому что это не значение, которое вы отправляете, — это физическое время отклика вашего стека, и посредник, который терминирует и заново устанавливает TLS, меняет его независимо от вашего желания.
По состоянию на 2026 год JA4 работает в продакшене у Cloudflare, Akamai и AWS WAF среди прочих. Считайте его повсеместно внедрённым, а не новой техникой.
HTTP/2: отпечаток Akamai
HTTP/2 выдаёт не меньше, чем TLS, и те, кто пытается слиться с фоном, проверяют его реже.
Чаще всего используется формат Akamai, и в нём четыре части, разделённые вертикальными чертами:
- Кадр SETTINGS — параметры, которые отправляет клиент, и их значения, по порядку. У Chrome, Firefox и Safari наборы разные. И у каждой HTTP-библиотеки тоже.
- WINDOW_UPDATE — начальное приращение окна на уровне соединения.
- Кадры приоритетов — отправляет ли их клиент и как выстраивает дерево.
- Порядок псевдозаголовков — последовательность
:method,:authority,:scheme,:path. Chrome используетm,a,s,p. Большинство библиотек — нет.
Последний пункт эффективен до смешного. Спецификация HTTP/2 порядка не предписывает, поэтому каждая реализация выбрала свой и с тех пор его не меняла. Запрос, выдающий себя за Chrome, но отправляющий псевдозаголовки в другой последовательности, уже противоречит сам себе, прежде чем сервер прочитал хоть один настоящий заголовок.
Почему это не починить из интерфейса браузера
Об этом стоит сказать прямо, потому что это противоречит изрядной части маркетинга — включая, честности ради, маркетинг всей этой отрасли.
Настройки отпечатка в вашем антидетект-браузере — режим canvas, вендор WebGL, часовой пояс, шрифты — работают внутри рендерера. TLS-рукопожатие происходит в сетевом стеке, в другом процессе, ещё до того, как рендерер вступает в дело. Настройки, которая его изменит, не существует, потому что в профиле нечего менять: рукопожатие формирует BoringSSL в том виде, в каком он вкомпилирован в бинарник.
Отсюда единственная по-настоящему хорошая новость этой статьи: если вы управляете настоящей сборкой Chromium, ваши отпечатки TLS и HTTP/2 уже являются отпечатками Chrome. Puppeteer поверх настоящего Chrome, Playwright поверх настоящего Chrome и любой антидетект-браузер на Chromium дают то же рукопожатие, что и Chrome на вашем рабочем столе, потому что это один и тот же код. Флаги автоматизации этого не меняют.
На этом слое попадаются клиенты, которые браузерами вовсе не являются: requests, axios, httpx, го-шный net/http, curl. Они выставляют user agent от Chrome, а потом отдают ClientHello, какого Chrome никогда не порождал. Именно это несоответствие JA4 и создавали ловить.
Что прокси делают с рукопожатием
Выбор прокси здесь важен, и в этом различии большинство руководств ошибается.
| Тип прокси | Влияние на отпечаток TLS |
|---|---|
| SOCKS5 | Никакого. Пересылает байты TCP, не трогая их; ваш ClientHello доходит до сервера в целости. |
| HTTP CONNECT | Никакого. Открывает туннель; TLS согласуется через него от края до края. |
| MITM / с терминацией TLS | Полное. Прокси выполняет собственное рукопожатие, поэтому сервер видит его отпечаток, а не ваш. |
Проблемный случай — последняя строка, и не всегда вы сами на него соглашались. Корпоративные инспекционные устройства, некоторые прокси-сервисы «с оптимизацией SSL» и любой локальный отладочный инструмент из семейства Charles или Fiddler терминируют TLS. Если отпечаток браузера вдруг стал экзотическим, ищите перехватчик прежде всего остального.
Стоит добавить: JA4L делает частично заметным даже прозрачный прокси, потому что лишний переход стоит времени. Настройками это не убрать. Это довод в пользу прокси, географически близкого к заявляемой точке выхода, а не такого, который гонит трафик через три континента.
Какие флаги важны, а какие нет
Постоянно спрашивают, меняют ли рукопожатие флаги запуска Chrome. В основном нет, и исключения стоит знать.
Не влияют на TLS: --headless, --no-sandbox, --disable-gpu, --disable-dev-shm-usage, задание размеров окна и всё семейство флагов рендерера. Они меняют то, как рисуются страницы и как изолируется процесс, а не то, как BoringSSL здоровается с сервером.
Реально влияют: --disable-http2 принудительно откатывает на HTTP/1.1, что убирает отпечаток HTTP/2 и заменяет его чем-то более редким, а значит и более заметным: современный Chrome, отказывающийся от h2, — редкость. --ssl-version-min и подобные напрямую меняют то, что предлагается в ClientHello. Опции, отключающие QUIC, меняют, какие протоколы пробуются и в каком порядке.
Общее правило: если флаг звучит так, будто трогает сетевой стек, считайте, что он меняет ваш отпечаток, и проверьте это до выхода в бой.
Как проверить свой
Три публичных эндпоинта расскажут, где вы стоите, меньше чем за минуту:
- tls.peet.ws/api/all — возвращает ваши JA3, JA4, полный отпечаток HTTP/2 в формате Akamai и порядок заголовков в JSON. Самая полная картина в одном месте.
- browserleaks.com/tls — то же самое, но в более дружелюбном виде.
- scrapfly.io/web-scraping-tools/ja3-fingerprint — удобно, чтобы сравнить клиента с известными эталонными подписями браузеров.
По-настоящему важный тест требует двух окон. Откройте один из этих адресов в обычном десктопном Chrome, затем откройте его же через инструмент, который вы оцениваете. Сравните JA4 и отпечаток HTTP/2 поле за полем. Если они совпадают, этот слой — не ваша проблема, и внимание лучше направить на поверхность CDP и на то, складывается ли ваш отпечаток в целое. Если различаются, никакая настройка canvas вам не поможет.