AntiDetect
Возможности Технология Цены Для кого
Документация Блог FAQ
Язык
EnglishItalianoDeutschEspañolРусский
Скачать

Отпечаток, до которого ваш JavaScript не дотянется

Ещё до того, как выполнится первая строка скрипта вашей страницы, браузер уже представился дважды — в TLS-рукопожатии и в преамбуле HTTP/2. И то и другое — отпечатки, их читает каждая крупная CDN, и ни один из них нельзя подменить изнутри страницы.

Два представления до запуска любого скрипта

Всё, что пишут о браузерном фингерпринтинге, касается того, что страница может измерить: 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 — основа более широкого семейства, и здесь важны два его родственника:

По состоянию на 2026 год JA4 работает в продакшене у Cloudflare, Akamai и AWS WAF среди прочих. Считайте его повсеместно внедрённым, а не новой техникой.

HTTP/2: отпечаток Akamai

HTTP/2 выдаёт не меньше, чем TLS, и те, кто пытается слиться с фоном, проверяют его реже.

Чаще всего используется формат Akamai, и в нём четыре части, разделённые вертикальными чертами:

  1. Кадр SETTINGS — параметры, которые отправляет клиент, и их значения, по порядку. У Chrome, Firefox и Safari наборы разные. И у каждой HTTP-библиотеки тоже.
  2. WINDOW_UPDATE — начальное приращение окна на уровне соединения.
  3. Кадры приоритетов — отправляет ли их клиент и как выстраивает дерево.
  4. Порядок псевдозаголовков — последовательность :method, :authority, :scheme, :path. Chrome использует m,a,s,p. Большинство библиотек — нет.

Последний пункт эффективен до смешного. Спецификация HTTP/2 порядка не предписывает, поэтому каждая реализация выбрала свой и с тех пор его не меняла. Запрос, выдающий себя за Chrome, но отправляющий псевдозаголовки в другой последовательности, уже противоречит сам себе, прежде чем сервер прочитал хоть один настоящий заголовок.

Четыре сегмента отпечатка HTTP/2 в формате Akamai, каждый подписан
Отпечаток HTTP/2 в формате Akamai. Последний сегмент — порядок псевдозаголовков: Chrome шлёт m,a,s,p, а большинство HTTP-библиотек — нет.

Почему это не починить из интерфейса браузера

Об этом стоит сказать прямо, потому что это противоречит изрядной части маркетинга — включая, честности ради, маркетинг всей этой отрасли.

Настройки отпечатка в вашем антидетект-браузере — режим 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, меняют, какие протоколы пробуются и в каком порядке.

Общее правило: если флаг звучит так, будто трогает сетевой стек, считайте, что он меняет ваш отпечаток, и проверьте это до выхода в бой.

Как проверить свой

Три публичных эндпоинта расскажут, где вы стоите, меньше чем за минуту:

По-настоящему важный тест требует двух окон. Откройте один из этих адресов в обычном десктопном Chrome, затем откройте его же через инструмент, который вы оцениваете. Сравните JA4 и отпечаток HTTP/2 поле за полем. Если они совпадают, этот слой — не ваша проблема, и внимание лучше направить на поверхность CDP и на то, складывается ли ваш отпечаток в целое. Если различаются, никакая настройка canvas вам не поможет.

Один бинарник, одно рукопожатие

Профили P8 работают внутри настоящей сборки Chromium, поэтому слои TLS и HTTP/2 — родные для Chrome, а не клиент на Node или Python, нацепивший user agent Chrome.

Начать бесплатно
Все статьи Далее: десять способов, которыми CDP вас выдаёт