Представьте ситуацию: вы тщательно подготовились к работе с мультиаккаунтингом - настроили окружение, для каждого потока прописали уникальный резидентный прокси, уверены в чистоте ваших IP-адресов. Но после старта все ваши аккаунты один за другим улетают в бан, хотя каждый поток работал со своего уникального IP-адреса. Как говорится - ситуация патовая, в чем может быть дело? 

Причина, по которой вы лишились своих профилей может быть в TLS-фингерпринтинге. Это не какая то скрытая технология цивилизации древних Атцеков, а вполне себе современная методика, которая работает глубже уровня IP-адреса и позволяет идентифицировать устройства и сессии по характерному отпечатку TLS-соединения.

Другими словами, если у всех ваших запросов будет одинаковый TLS-отпечаток, даже самые качественные прокси не спасут от блокировки на платформах, которые умеют работать с этими отпечатками. 

Что такое TLS-фингерпринтинг и как он работает

TLS (Transport Layer Security) - это криптографический протокол, обеспечивающий защищенное HTTPS-соединение между клиентом и сервером. И тут нас интересует самый первый обмен данными - TLS-рукопожатие. Во время этого виртуального обмена клиент отправляет сообщение ClientHello с набором параметров для согласования шифрования. Вот эти то параметры во многом и могут спалить, серверу кто к нему подключается.

Именно набор данных, которые содержаться в ClientHello и формирует уникальный TLS-отпечаток, один из цифровых идентификаторов клиента.

На скриншоте ниже я привел пример такого отпечатка - это скриншот реального TLS-рукопожатия, которое я перехватил Wiresharkом на своем локальном устройстве.

Проблема (а для кого-то это реально станет проблемой) в том, что каждый браузер, библиотека или ОС реализуют TLS по-своему, поэтому то набор параметров и получается уникальным.

Отпечаток TLS всегда будет постоянным для конкретного клиента независимо от его IP-адреса или используемого прокси. Он может незначительно измениться, если изменится набор шрифтов или расширений, но в большинстве случаев будет идентичен.

Из чего формируется TLS-отпечаток:

  • Версия TLS. Стандартный Chrome поддерживает TLS версии 1.3, а у Python библиотеки requests будет версия 1.2 или тоже 1.3, как у Хрома и т.д.

  • Набор шифров (Cipher Suites). У каждого браузера они плюс минус похожи, но отличия будут - у Firefox примерно 15 шифров, а у Chrome около 17, скрипты (python requests, curl) имеют еще более короткий список, характерный для библиотеки OpenSSL, но при этом сами алгоритмы шифрования могут отличаться.

  • Список расширений TLS. Сюда относят дополнительные опции протокола (SNI, ALPN, OCSP и др.), которые решают различные прикладные задачи. Набор и количество расширений также зависит от браузера, у каждого из них цифра будет своя - это и формирует разницу.

  • Поддерживаемые группы (кривые). Это уже вообще "математический язык", на котором строится защита. У каждого браузера свой уникальный список методов.

  • Алгоритмы подписи. Предпочтительные алгоритмы для цифровой подписи в рамках TLS (различаются по приоритетам между клиентами). Это такой список стандартов, которые ваш браузер в состоянии проверить. У Chrome это проверка по одним алгоритмам, у Safari по другим, суть вы думаю уловили.

Тут еще важно понимать нюанс - сам набор может быть примерно одинаковым, а вот порядок их передачи разным. Если два разных клиента будут поддерживать один и тот же список шифров или расширений, но отправят их в разной последовательности - мы получим разные отпечатки. Вот такая тонкость - любая, казалось бы, мелочь - а итог разный.

Интересная аналогия с приготовлением пищи - если вы сначала положите в сковороду чеснок, и только перед подачей блюда опустите в нее мясо, на 5-10 минут - у него будет совершенно другой вкус, чем у блюда приготовленного по классическому рецепту - сначала мясо, а перед подачей за 5 минут чеснок. Так и тут - порядок передачи имеет серьезное значение!

JA3 - при чем тут третья часть популярной в 00-х игры на ПК?

Кто такой же древний мамонт как и я, и помнит игру про наемников Jagged Aliance, вероятно подумал - дед опять забыл таблетки принять, но нет - я все правильно пишу - речь не про гейминг, а все так же про TLS-отпечатки, а вернее про технику их передачи.

JA3 - это хэш, длиной 32 символа, который вычисляется по совокупности перечисленных выше параметров. Его удобно хранить и сверять. И вот этот хеш и будет нашим отпечатком.

Каждая уникальная комбинация параметров даст свой JA3-хэш, и даже минимальное отличие сформирует разные хеши - Chrome 120 на Windows 11 и на Firefox 121 на одном и том же устройстве даст разные JA3-отпечатки.

Узнать свой JA3 хэш можно с использованием специальных сервисов (tls.peet.ws или через встроенный функционал Wireshark).

Справка: Wireshark - это программное обеспечение для анализа сетевого трафика (сниффер), с помощью которого вы можете увидеть в реальном времени данные, проходящие через ваш компьютер. Предупреждаю, стоит только начать и остановиться потом будет сложно.

Резюмируем: TLS-фингерпринтинг позволяет достатоверно отделить одного клиента от другого, анализируя только лишь сетевые параметры шифрованного соединения. Ни смена IP, ни подмена User-Agent здесь не помогут - "почерк" вашего TLS-рукопожатия останется прежним.

Почему прокси не скрывают TLS-отпечаток

Использование прокси-сервера по-дефолту рассматривается как способ скрыть или подменить свою личность в сети. И отчасти это так и работает. Если вы будете использовать прокси чтобы замаскировать IP-адрес одного конкретного юзера на конкретном устройстве - все получится, прокси скроет реальный IP-адрес.

Не хочется душнить по поводу предыдущего абзаца - но соблазн велик. Смена IP-адреса не скрывает вас со 100% уверенностью, при желании сервис может вытащить ваш реальный IP-шник, есть несколько способов и все они известны. Так что без дополнительной защиты просто использование прокси - это иллюзия маскировки, не более того.

С мультиаккаунтингом это так не работает. Прокси работает на сетевом уровне, и его возможности ограничены передачей трафика через другой IP. 

При HTTPS-соединении TLS-рукопожатие происходит напрямую между вашим устройством и целевым сервером, а прокси лишь пересылает уже зашифрованные данные, не вмешиваясь в их содержимое.

Прокси меняет для запроса лишь некоторые внешние атрибуты:

  • IP-адрес, который видит сайт (маскируя ваш реальный адрес);

  • Геолокацию (зависит от IP прокси);

  • Маршрут трафика в сети (пропускает через себя);

  • В некоторых случаях позволяет обойти региональные блокировки контента.

Однако прокси не способен изменить такие вещи, как:

  • TLS-отпечаток вашего браузера или скрипта;

  • Отпечатки браузера: Canvas, WebGL, аудио, шрифты и пр.;

  • HTTP-заголовки и характеристики самого клиента (если вы их вручную не меняли);

  • Другие аппаратно-программные признаки (разрешение экрана, часовой пояс, плагины и т.д.).

Отсюда следует простой вывод: даже самый надежный прокси, не делает ваш запрос невидимым для систем фингерпринтинга. Если вы запускаете несколько сессий через разные прокси, но одним и тем же клиентом (который просто позволяет менять ip-адреса, не трогая ничего из вышеперечисленного), то для целевого сайта все эти сессии выглядят как исходящие с одного и того же устройства.

Типичная ошибка новичков - покупать дорогие резидентные прокси в надежде, что смена IP решит проблему анонимности или мультиаккаунтинга. Дороже - не значит сильнее защищенные. Дорогие прокси это не про полную защищенность, а про качество полученных IP-адресов. Дорогие прокси с большей степенью вероятности не будут висеть в черных списках и не будут иметь какую-то серую историю использования (хотя и это не факт, но шанс получить мертвый пул меньше, и вот это уже факт).

Если вы не меняете TLS-отпечаток (и не только его, так как TLS-отпечаток - лишь одна из составляющих браузерного фингерпринта), то хоть по 5$, хоть по 10$ вы купили прокси для каждого аккаунта, результат будет предсказуем - бан ваших профилей или усложнение работы (частая капча, ошибки и т.п.).

Вот вам и ответ - почему вас банят даже с чистых прокси - IP-адрес новый, а цифровой след остался прежним.

Тем не менее, сами по себе прокси остаются важным инструментом - они решают задачу разделения и маскировки IP-адресов. Но для полноценной анонимности их необходимо сочетать с другими мерами антидетекта.

Как платформы используют TLS-фингерпринтинг для блокировок

Технологию TLS-фингерпринтинга уже давно используют практически все крупные платформы, борющиеся с ботами, мошенничеством и мультиаккаунтингом. Более того, даже многие средние по размеру сервисы подключают готовые решения для снятия отпечатков устройства. Можно сказать так - если веб-платформа серьезно относится к безопасности, велика вероятность, что при каждом вашем HTTPS-запросе она пассивно собирает TLS-отпечаток клиента и сверяет его с известными шаблонами.

Теперь к персоналиям:

Cloudflare и аналогичные антибот-сервисы. Cloudflare, защищая сайты от ботов, активно анализирует TLS-рукопожатия. Если JA3-хэш вашего запроса не совпадает с шаблоном ни одного распространенного браузера, запрос помечается как подозрительный. Например, вызовы из Python-скрипта с библиотекой requests имеют совсем иной TLS-почерк, чем у Chrome/Firefox, и Cloudflare их либо блокирует, либо выдает капчу или вызывает специальную страницу с JS-челленджем (Turnstile). Таким образом, если dfi клиент выдает себя на этапе TLS, защита среагирует независимо от IP.

Социальные сети и рекламные кабинеты (Meta, TikTok, и т.д.). Facebook и Instagram применяют очень строгий фингерпринт-контроль. Их системы связывают между собой аккаунты с одинаковыми TLS-отпечатками, даже если те никогда не входили с одного IP-адреса. В результате блокировка одного профиля может автоматически затронуть все связанные аккаунты.

Meta помимо TLS учитывает десятки других признаков (Canvas, WebGL, фоновые сенсоры и пр.) для построения многомерного портрета пользователя.

TikTok также агрессивно отслеживает мультиаккаунты - помимо TLS-отпечатка, они смотрят на поведение (одновременный вход, схожие действия), но одного только общего TLS-профиля уже будет достаточно, чтобы связать ваши учетные записи между собой.

Маркетплейсы и e-commerce (Wildberries, Ozon, Amazon и др.). Крупные торговые платформы применяют TLS-фингерпринтинг не только против мультиаккаунтов селлеров, но и для защиты от массированного парсинга данных.

Wildberries и Ozon борются с автоматическим сбором цен конкурентов, отслеживая однотипные TLS-отпечатки на множестве запросов. Если вы запустите парсер с несколькими прокси, но он везде будете использовать одну и ту же библиотеку HTTP (а значит и один отпечаток) - маркетплейс довольно быстро это вычислит. В течение нескольких часов IP-адреса ваших прокси попадут на карандаш или вообще улетят в бан, поскольку система увидит сотни запросов с идентичным TLS-почерком и заблокирует весь диапазон IP-адресов как вредоносный.

Рекламные системы (Google Ads и др.). Google Ads проверяет TLS-отпечаток при создании новых рекламных аккаунтов и при подозрительной активности. Если вы пытаетесь завести, несколько кабинетов с разных IP-адресов, но на одном и том же устройстве, то все они будут помечены и отправлены на ручную модерацию (или просто превентивно заблокированы).

Другие площадки (Amazon/eBay, LinkedIn, Twitter/X, Авито) также в той или иной степени учитывают TLS-фингерпринт при автоматическом поиске аномалий.

Сейчас внимательно! Я старался уточнять, но если у кого-то сформировалось впечатление, что при использовании одного устройства и нескольких прокси, вас выдаст именно TLS-отпечаток - это далеко не так. TLS всего лишь один из методов, который используется антибот-системами для определения аномальной активности. Антифрод-системы работают по методу скоринга (начисления штрафных баллов), и TLS-отпечаток просто один из кирпичиков в общем каркасе.

Способы обхода TLS-фингерпринтинга

Если TLS-отпечаток может нас выдать, логичный подход для обхода - изменить или замаскировать его. В идеале наш клиент должен выглядеть как самый обыкновенный браузер реального пользователя, или каждый поток автоматизированных запросов должен иметь разные TLS-профили, чтобы их нельзя было связать друг с другом. Логично? Конечно логично, но как этого добиться?

Вот какие способы для борьбы с TLS-фингерпринтингом используют:

  • Использовать настоящий браузер через автоматизацию. Самый простой способ сгенерировать правдоподобный TLS-пакет - это реально открыть браузер (Chrome, Firefox и т.п.), который сам осуществит обмен данными с сервером. Инструменты типа Selenium, Puppeteer, Playwright в связке с браузером Chromium/Firefox дают аутентичный TLS-отпечаток штатного браузера. Даже в headless-режиме современные браузеры обмениваются с сервером теми же ClientHello, что и в обычном, поэтому по одному TLS-отпечатку их не отличить от обычного пользователя. Однако запуск браузера через средства автоматизации может оставлять другие следы, но это уже тема другой статьи.

  • Использовать антидетект-браузеры. Антидетект-браузеры - это одно из самых надежных решений. По сути, антидетект-браузеры - это модифицированные Chromium или Firefox, которые для каждого профиля генерируют уникальный набор фингерпринтов: от Canvas и WebGL до TLS. Они могут при старте нового профиля выдавать ему случайный, но реалистичный TLS-отпечаток, взятый из базы реальных устройств. Или же сгенерировать параметры на лету, рандомизируя их под правдоподобные комбинации. Плюс в некоторых случаях можно настроить эти параметры вручную, но подмена TLS-отпечатка это уже более тонкая настройка, и выполнять ее не профессионалам не рекомендуется. Отпечаток должен выглядеть достоверно. Если задать несуществующую в природе комбинацию TLS-параметров, умные системы это тоже распознают как подделку. Качественные антидетекты избегают таких ошибок, предоставляя профили неотличимые от обычных пользователей.

    Антидетект-браузер в связке с уникальным прокси на каждый аккаунт - стандартное решение для безопасного мультиаккаунтинга. В контексте веб-парсинга антидетект-браузер менее удобен (сложнее масштабировать на сотни потоков), как правило их используют точечно, для прохождения сложной капчи.

  • Имитация TLS-пакета программными методами. Профессионалы могут настраивать низкоуровневые параметры TLS-соединения вручную. Есть библиотеки и патчи для HTTP-клиентов, которые позволяют задать свой порядок шифров, расширений и т.д., тем самым эмулировать TLS-рукопожатие нужного браузера.

  • Ротация TLS-отпечатков. Если эмулировать браузерный профиль сложно, можно попробовать альтернативный подход - частую смену TLS-отпечатка, чтобы каждый поток запросов выглядел по-разному. Некоторые прокси провайдеры или сервисы парсинга предлагают функцию динамической подмены TLS-профиля. По сути, ваш запрос проходит через специальный сервер, который рандомизирует параметры TLS перед соединением с нужным сайтом. Однако важно, чтобы подменяемые отпечатки тоже соответствовали реальным устройствам, иначе вместо одного подозрительного профиля вы можете создать несколько подозрительных.

Каждый из методов имеет свои плюсы и минусы по сложности реализации и эффективности. Лучше всего комбинировать несколько подходов.

Для массового парсинга данных использовать ротацию прокси + утилиты для спуффинга TLS, а для управления учетными записями - антидетект-браузеры + выделенные прокси для каждого профиля.

Общий же принцип один - недостаточно скрыть свой IP, нужно еще и убедить сервер, что вы обычный пользователь. 

Заключение

Эпоха, когда смены IP-адреса было достаточно для анонимности или обхода банов, осталась позади. TLS-фингерпринтинг доказал свою эффективность в распознавании ботов и связывании учетных записей, поэтому крупные интернет-платформы внедрили его повсеместно. Если вас необъяснимо блокируют даже при использовании чистых резидентных прокси, очень вероятно, что дело именно в TLS-отпечатке вашего клиента. А значит важно следить не только за чистотой прокси, но и за тем, какой след оставляет ваш софт.