Сравнение браузерных отпечатков популярных библиотек и BlankTrail Proxy по TLS, HTTP/2 и HTTP/3

TLS, HTTP2/HTTP3, Chrome154, Edge154, Firefox156, Safari на Mac и iPhone, Android и TLS resumption: реальные тесты библиотек, штатная настройка профилей и работа BlankTrail со старым софтом.

В User-Agent можно написать Chrome/154.0.0.0, но сервер сначала увидит TLS-рукопожатие, затем параметры HTTP/2 и только после этого - заголовки запроса. Если эти слои не согласованы, то строка «Chrome 154» не превращает HTTP-клиент в Chrome.

Мы сравнили основные публичные семейства библиотек для подмены браузерного сетевого отпечатка и BlankTrail Proxy: готовые профили, попытку представиться Chrome 154, Firefox 156, Safari на macOS и iPhone, Chrome на Android и повторное подключение, HTTP2 и HTTP3. Проверили также практический вопрос: можно ли получить нужную версию штатными настройками, без переписывания библиотеки, и насколько сложно встроить решение в свой стек.

Срез исследования - 4 октября 2026 года. Реальные запросы с Windows, Linux и macOS, серверные измерения, TCP и QUIC ClientHello и захваты настоящих браузеров. Краткая публичная проверка - BlankTrail /client, подробный разбор повторяем через независимый публичный сервис. Сводка детектора и сравнение сырых полей оцениваются отдельно.

Единая методика сравнения TLS, HTTP/2, QUIC/HTTP/3, браузерных профилей и заголовков.
Единая методика сравнения TLS, HTTP/2, QUIC/HTTP/3, браузерных профилей и заголовков.

Что именно сравнивает сервер

TLS-отпечаток складывается из того, как клиент строит ClientHello: набор и порядок шифров, расширения и их содержимое, поддерживаемые группы, алгоритмы подписи, ALPN, GREASE, сжатие сертификатов, ALPS и ключевые доли. Для HTTP/2 существенны SETTINGS и их порядок, WINDOW_UPDATE, порядок псевдозаголовков и параметры приоритизации. На HTTP-уровне добавляются User-Agent, Client Hints и контекстные заголовки.

JA4 - удобная сводка, а не полное описание соединения. У нескольких последовательных версий Chrome один JA4 - это нормально. В наших эталонах Chrome 152, 153 и 154 совпадают по свежему JA4 и базовому HTTP/2-отпечатку. Равенство этих значений само по себе не подтверждает точную версию и не доказывает равенство содержимого расширений. JA4, например, не сохраняет всю полезную нагрузку trust_anchors и исключает GREASE при расчёте соответствующих частей хеша. Описание алгоритма опубликовано в репозитории JA4.

Как сравнивали клиентов

Цели - Chrome154, Edge154, Firefox156, Safari26 и мобильные профили. Сравнивали TLS, HTTP/2, сырые HTTP/3-поля, заголовки и повторные соединения с реальными браузерными захватами. Проверяли готовые пресеты и штатную ручную настройку. Совпадение JA4 или отсутствие замечаний /client не заменяет разбор сырых полей.

Методика, версии эталонов и условия замеров

Библиотеки запускались в отдельных тестовых каталогах, BlankTrail - через его API. Для основных конфигураций выполнялись четыре последовательных запроса в одном клиентском сеансе. Проверочный endpoint закрывал соединение, чтобы следующий запрос мог создать новое TLS-соединение и использовать полученный ticket. Повторный запрос по уже открытой HTTP/2-сессии не считался тестом TLS resumption.

Для каждой конфигурации сохранялись ответ /client и серверная запись: TLS-поля, принятие PSK, HTTP/2 SETTINGS, окно соединения и порядок псевдозаголовков. Краткий детект сопоставлялся с сырыми данными.

Свежий Chrome154 измерен настоящим Chrome154.0.8037.93 на Windows с отдельным headless-профилем. Для полного ClientHello и возобновления использованы сохранённые захваты Chrome154.0.8037.57 из официального Stable-пакета, снятые в обычном оконном режиме под Xvfb. Источник и SHA256 пакета проверены.

TCP-приёмник сохранял ClientHello до завершения рукопожатия, его намеренное закрытие не считалось ошибкой клиента. Сравнивались постоянные параметры и структура: случайные ключи, random и session ID должны различаться. У GREASE проверяли присутствие, положение и перемешивание, у trust_anchors - набор идентификаторов.

У HTTPX и primp на endpoint, закрывающем соединения, некоторые повторные запросы завершились ошибкой обработки закрытого HTTP/2-соединения. Эти ошибки не записаны как несовпадение отпечатка: для таких строк приведены только полученные сетевые записи, а результат неполного прогона отмечен отдельно.

Проверили 20 клиентов: браузерные профили, сырые поля TLS, HTTP/2 и HTTP/3, заголовки и поведение повторных соединений. Эталоны -захваты настоящих Chrome154, Edge154, Firefox156, Safari 26.6.2 и мобильных браузеров. Совпадение JA4 само по себе не считалось прохождением: сравнивались постоянные поля и поведение протоколов, границы подтверждения указаны рядом с результатами.

Для браузерных колонок проверялись доступные готовые профили, а при наличии соответствующего API - ручные параметры. На общем endpoint выполнены серии запросов с UA Chrome154, Safari 26.6.2, Firefox156, Edge154 и Chrome Android154, сохранены сырые ClientHello и серверные TLS/H2-поля. Для Go-серий между запросами закрывались простаивающие соединения с сохранением клиента и его кэша. Windows curl проверен также четырьмя URL в одном процессе. Встроенный Node fetch проверен отдельно без подмены dispatcher. Изменение UA само по себе не считается настройкой транспортного профиля.

Почему возраст профиля имеет значение

В выборке StatCounter Chrome154 превысил половину номерного настольного Chrome-трафика за 9 дней после релиза, Chrome153 - за 13. Старый пресет быстро перестаёт представлять основную массу трафика. Обновлять нужно весь профиль, а не только номер в User-Agent, при этом старая версия сама по себе не доказывает автоматизацию. Однако мы заметили что для большинства антифрод систем версия браузера очень важна, и устаревании более чем на 3 мажорные версии усложняет прохождение антибот проверки.

Скорость перехода на новые версии Chrome: расчёт по ежедневным данным StatCounter. Источник: gs.statcounter.com, CC BY-SA 3.0.
Скорость перехода на новые версии Chrome: расчёт по ежедневным данным StatCounter. Источник: gs.statcounter.com, CC BY-SA 3.0.
Источник и ограничения статистики

Расчёт по ежедневным данным StatCounter Desktop / Worldwide, 8 сентября - 1 октября, внутри распознанного номерного Chrome-трафика. Android не включён. Это доли просмотров, не установок или уникальных пользователей. Методика - FAQ StatCounter, график CC BY-SA3.0.

Обычный Chrome154 Stable вышел 22 сентября, с Chrome153 цикл мажорных выпусков сократился до двух недель. Источники: релиз Chrome154, цикл выпуска Chrome.

Какие решения мы проверили

Сравниваем публичные семейства TLS-имперсонации, их обёртки и обычные HTTP-клиенты для контроля. Это рейтинг проверенных возможностей, а не популярности: сопоставимых данных о числе пользователей нет. Обёртки одного ядра не считаются независимыми TLS-движками.

Решение / проверенная версияСтек и интеграцияКак меняется профиль
curl-impersonate и активный fork, через curl_cffi 0.16.3CLI/libcurl и Python. Удобен для скриптов, важна именно сборка impersonate, обычный curl не эквивалентен.Готовые цели, libcurl-параметры, JA3/Akamai и extra_fp через обёртку. Семейство измерено через curl_cffi, отдельный бинарник оригинального fork не запускался.
curl_cffi 0.16.3Python, близкий к requests интерфейс, sync/async, требуется native libcurl из поставки.impersonate, ja3, akamai, extra_fp. Готового chrome154 в проверенной версии нет.
uTLS 1.8.2Go, низкий уровень. Управляет ClientHello, HTTP/2 и заголовки нужно согласовать отдельно.Hello-профили, HelloCustom, ApplyPreset, ClientHelloSpec. HelloChrome_Auto в этой версии указывает на Chrome 133, не на текущий Stable.
Go tls-client 1.16.0Go и native-ядро для обёрток, TLS и HTTP/2 собраны вместе. Нужно заменить HTTP-клиент в коде.Готовые ClientProfile, варианты с PSK и собственный профиль. Самый новый готовый Chrome - 152, профиля с именем 154 нет.
Python tls-client 1.0.1Python, простой Session API с native-библиотекой. Версия обёртки не означает актуальное Go-ядро.client_identifier и custom TLS/HTTP2-параметры. В проверенной поставке Chrome-пресеты заканчиваются на 120.
noble-tls 0.1.9 / native 1.16.0Python async. Обновляет native tls-client отдельно от Python-пакета, версия ядра должна фиксироваться для воспроизводимости.Enum пресетов, публичный client_identifier и custom-настройки. Загруженное ядро принимает 152/152_PSK, хотя enum обёртки отстаёт.
CycleTLS 2.0.5Go/Node.js. В Node запускается вспомогательный процесс, требуется управлять его жизненным циклом.JA3, JA4R и HTTP2Fingerprint. Ручная настройка зависит от поддержки расширений самим ядром.
rnet 2.4.2Python native-клиент, sync/async. Старую поставку нельзя автоматически считать актуальным wreq.Impersonate enum, проверенный Chrome-пресет - 137, имени Chrome154 нет.
wreq, Python 0.12.3Rust и Python binding, sync/async, удобный выбор браузера и платформы, но API отличается от requests.Emulation(Profile, Platform), настройки TLS/H2. В проверенном Python-пакете последний Chrome - 153.
wreq-js 3.2.0Node.js/Bun, fetch-подобный API, native Rust binding. У обёртки собственный график обновлений.browser, os, публичные TLS/H2 overrides. Готовые Chrome-профили заканчиваются на 149.
primp 2.0.1Python sync/async, простой клиент на native-движке. Выбор ОС и браузера требует мало кода.impersonate / impersonate_os, готовый Chrome 153. Публичного полного ClientHelloSpec в проверенном конструкторе нет.
got-scraping 4.2.1Node.js ESM, близок к got. Проект объявлен EOL и рекомендует impit.Генерация заголовков и настройки TLS транспорта. Выбор версии в генераторе заголовков не создаёт соответствующий полный ClientHello.
impit 0.14.5Node.js/Python, fetch-подобный API, native Rust-ядро. Удобен для новых запросных клиентов.browser presets, в проверенном Node-пакете есть Chrome 151, Chrome154 отвергается.
req/v3 3.61.0Go, высокий уровень с fluent API. TLS и HTTP/2 настраиваются публичными методами.ImpersonateChrome, SetTLSFingerprint, SetTLSFingerprintSpec, H2 settings. Встроенный ImpersonateChrome использует Chrome 120.
httpcloak 1.7.2Go и обёртки, проверен Python. Готовые пресеты плюс удобный экспорт/импорт JSON.preset, JA3/Akamai, describe_preset и load_preset_from_json. Последний Chrome-пресет - 152, пользовательский профиль 154 испытан отдельно.
BlankTrail Proxy 1.3.15Отдельное HTTP/SOCKS-прокси-приложение для разных языков, в том числе старого и стороннего ПО. Настраивается на уровне клиента, для подмены HTTPS-транспорта требуется установка сертификата в систему или игнорирование сертификата в клиенте.Готовые браузерные профили TLS/HTTP2/HTTP3, выбор браузера и ОС или подбор по User-Agent. Базу профилей обновляет продукт, встраивать библиотеку в код не требуется.

Лёгкий API не снимает задачу сопровождения. К примеру если приложение уже использует requests, то переход на Python-клиент обычно локален. Если библиотека написана для другого языка, то уже нужен binding, отдельный сервис или переработка транспорта. Для сторонней закрытой программы встроить новую библиотеку часто невозможно. А обновление пакета, native-ядра, выбранного пресета и собственных заголовков - это уже четыре разных действия.

Сравниваем библиотеки с настоящим Chrome 154

В проверенных поставках на 3 октября готового Chrome154-пресета не было: использовали самый новый доступный или штатный автоматический профиль с User-Agent154. Исключения - готовый Chrome_154_win у BlankTrail, генератор заголовков got-scraping и ручная настройка CycleTLS. Прямой выбор154 и возможности публичной настройки проверены отдельно. Ниже - совпадение JA4/H2, затем - сырые отличия, которые эти сводки скрывают.

Сравнение выбранных профилей с Chrome154 по свежему JA4 и HTTP/2. Совпадение сводки не означает совпадения всех полей, подробности доступны в раскрываемом блоке.
Сравнение выбранных профилей с Chrome154 по свежему JA4 и HTTP/2. Совпадение сводки не означает совпадения всех полей, подробности доступны в раскрываемом блоке.
Подробности проверки TLS и HTTP/2 по каждому профилю
Клиент / выбранный профильСвежий JA4HTTP/2Что остаётся проверить или исправить
curl_cffi / chrome150ОтличаетсяСовпалоНет trust_anchors, в алгоритмах подписи нет GREASE эталона 154.
Go tls-client / Chrome_152 и Chrome_152_PSKСовпалоСовпалоСырой съём подтвердил совпадение проверенных постоянных TLS-полей, включая GREASE, ALPS и 28 trust anchors. Заголовки 154 согласованы публичным API. Обычный профиль дал четыре полных рукопожатия, 152_PSK - одно полное и три принятых возобновления.
Python tls-client / chrome_120ОтличаетсяСовпалоСтарый набор групп, старый код ALPS, нет trust_anchors. Имя chrome_154 не даёт корректного нового профиля.
noble-tls / chrome_152_PSK, ядро 1.16.0СовпалоСовпалоСырой съём подтвердил совпадение проверенных постоянных TLS-полей, включая GREASE, ALPS и 28 trust anchors. Заголовки 154 согласованы публичным API, получены три принятых возобновления. Готового имени 154 нет, версию native-ядра нужно фиксировать.
rnet / Chrome137ОтличаетсяСовпалоСтарые signature_algorithms, нет trust_anchors. В четырёх запросах возобновление не наблюдалось.
wreq Python / Chrome153СовпалоСовпалоtrust_anchors содержит пустой список, sec-ch-ua остался 153 при User-Agent 154.
wreq-js / chrome_149ОтличаетсяСовпалоГотового 154 нет, публичные overrides не содержат параметра произвольного содержимого trust_anchors.
primp / chrome_153СовпалоСовпалоПустые trust_anchors, нет GREASE в signature_algorithms, отличается тело ALPS, sec-ch-ua - 153. Прогон ответов неполный.
got-scraping / генератор Chrome154ОтличаетсяОтличаетсяБраузерные заголовки не воспроизводят Chrome SETTINGS и TLS-расширения.
impit / chrome151ОтличаетсяОтличаетсяВ SETTINGS нет Chrome HeaderTableSize и есть дополнительный MaxFrameSize, отличается повторный TLS.
req / ImpersonateChromeОтличаетсяОтличаетсяПресет TLS 120, дополнительный SETTINGS_MAX_CONCURRENT_STREAMS=1000.
uTLS HelloChrome_Auto + Go HTTP/2ОтличаетсяОтличаетсяTLS-профиль 133 и самостоятельные настройки Go H2. uTLS не обещает автоматически настраивать HTTP/2.
httpcloak / chrome-latest-windowsСовпалоСовпалоИсходные Client Hints относятся к 152. Проверенные постоянные TLS-поля, включая непустой набор trust anchors, совпали с эталоном 154.
CycleTLS / скопированные JA3 и H2 Chrome154Соединение не установленоЯдро вернуло ошибку: расширение 51764 не поддерживается.
BlankTrail / Chrome_154_winСовпалоСовпалоClient Hints 154, проверенные постоянные TLS-поля и переход к resumed JA4 совпали с эталоном.

Контрольные requests 2.34.2, HTTPX 0.28.1, Node fetch, Go net/http и системный curl 8.13.0 со Schannel также отличаются от Chrome 154. Это ожидаемо: их назначение - корректно выполнять HTTP-запросы, а не воспроизводить браузер. HTTPX с включённым HTTP/2 всё равно отправляет свои SETTINGS. Сам факт поддержки HTTP/2 не равен совпадению с Chrome.

А теперь разберём отпечаток глубже, чем просто хеш JA4

Одинаковый JA4 не гарантирует одинаковый ClientHello: хеш не сравнивает все payload расширений. Ниже сводный сырой разбор TCP/TLS для цели Chrome154.

Сравнивали шифры, группы, signature_algorithms, версии TLS, группы и длины key_share, состав расширений и постоянные payload, включая ALPN, ALPS, GREASE и trust_anchors. Случайные байты ключей, ECH, билетов и binder не требовали побайтового совпадения, допустимые перестановки оценивали с учётом браузерного эталона.

КлиентПроверенный профильTLS-поляПовтор TLSЧто совпало / найденные отличия
BlankTrailChrome_154_win✓✓TLS: Проверенные TLS-поля, GREASE, ALPS и trust_anchors совпали.
Повтор: PSK принят, переход JA4 совпал с эталоном.
Go tls-client152 и 152_PSK✓△TLS: 8 ClientHello: проверенные поля, ALPS и 28 anchors совпали.
Повтор: 152: 0/4, 152_PSK: 3/4. Сервер выбрал PSK, расширение 41 - последнее.
noble-tlsnative1.16.0, 152 и 152_PSK✓△TLS: 8 ClientHello: проверенные поля и anchors совпали.
Повтор: 152: 0/4, 152_PSK: 3/4. Принятие PSK подтверждено ServerHello.
httpcloaklatest✓✓TLS: Проверенные поля и непустой набор anchors совпали.
Повтор: PSK работает в проверенной конфигурации.
wreq PythonChrome153△✓TLS: JA4 совпал, но trust_anchors - пустой список 0000. Алгоритмы подписи и ALPS совпали.
Повтор: PSK работает, пустой TLS-payload остаётся отличием.
primpchrome_153✕✕TLS: Пустые trust_anchors, нет GREASE в signature_algorithms, другое тело ALPS.
Повтор: Нужный PSK-переход не получен.
curl_cffichrome150✕✕TLS: Нет trust_anchors и GREASE эталона154 в алгоритмах подписи.
Повтор: Нужный TCP-переход не воспроизведён.
Python tls-clientchrome_120✕△TLS: Старые группы и код ALPS, нет trust_anchors. Имя chrome_154 не создаёт новый профиль.
Повтор: Частично, старый TLS-профиль сохраняет отличия.
rnetChrome137✕△TLS: Старые signature_algorithms, нет trust_anchors.
Повтор: В исходной серии - 0/4, итоговая оценка частичная.
wreq-jschrome_149✕△TLS: Старый профиль, overrides не задают payload anchors.
Повтор: Частично, точная целевая цепочка не подтверждена.
req/v3ImpersonateChrome✕✕TLS: Штатный TLS-профиль120 не соответствует154.
Повтор: Нужный Chromium PSK-переход не получен.
uTLS + Go HTTP/2Собственный транспорт✕△TLS: HelloChrome_Auto использует профиль133, кастомизация anchors возможна, готовый154 не получен.
Повтор: Частично, нужна отдельная настройка.
impitchrome151✕✕TLS: TLS-профиль151 и повторное рукопожатие отличаются.
Повтор: Повторный отпечаток отличается.
CycleTLSJA3 + H2 Chrome154✕✕TLS: Chrome154 JA3: ошибка неподдерживаемого extension51764.
Повтор: В этом режиме успешной цепочки нет, Safari - отдельно.
got-scrapingзаголовки154✕✕TLS: Собственный TLS при браузерных заголовках.
Повтор: Браузерный переход не воспроизведён.
Контроль: HTTPX, Go net/http, Windows curl, requests, Node fetchСобственный транспорт✕△TLS: Собственные ClientHello, готовой эмуляции Chrome154 нет.
Повтор: Go с cache и Node: PSK принят, TLS небраузерный. У остальных нужный переход не получен.

✓ - совпало в проверенной конфигурации, ✕ - целевой результат не получен, △ - частично или зависит от профиля. TLS-поля оцениваются относительно Chrome154. Принятие PSK само по себе не означает совпадения всего повторного отпечатка. У Go tls-client и noble-tls результат зависит от выбора обычного или PSK-профиля.

Главное различие, скрытое JA4: у wreq/primp trust_anchors содержит 0000, у использованного эталона и совпавших клиентов - 28 ID, 186 байт с длиной списка. У primp ALPS - 000403c9bb32, вместо эталонного 0003026832 с h2. Число anchors относится к этому захвату: Chrome Root Store обновляется отдельно от версии браузера.

Заголовки проверялись отдельно: у wreq/primp User-Agent154 сочетался с Client Hints153. Их можно согласовать через публичный API, но это не исправит пустой TLS-payload.

Можно ли перейти на свежую версию браузера без переписывания библиотеки

Отсутствие пресета с именем Chrome154 и невозможность получить его поведение - разные вещи. Мы проверили прямые имена профилей, доступные публичные параметры и несколько ручных конфигураций.

  • curl_cffi: impersonate="chrome154" отвергается. Передача эталонных JA3 и Akamai вместе с chrome150 выполнила запрос, но на проводе остался JA4 старого профиля без trust_anchors. Принятая конфигурация ещё не означает её полного применения.
  • Python tls-client: строка chrome_154 не привела к корректному профилю 154, хотя создание Session не сообщило об отсутствии профиля. Поэтому нужно смотреть провод, а не только успешный конструктор.
  • Go tls-client / noble-tls: готового имени 154 нет, но сырые захваты подтвердили совпадение проверенных постоянных TLS-полей профиля 152 с эталоном 154, а измеренный H2 также совпал. Вариант 152_PSK воспроизвёл возобновление, штатная установка заголовков согласовала HTTP-слой с 154. Правка исходников ядра для этого результата не потребовалась. Собственный ClientProfile/custom API позволяет расширять конфигурацию, но возможность воспроизвести каждую будущую версию данным тестом не доказана.
  • wreq / primp / rnet: прямой выбор 154 отвергается или отсутствует в enum. Старый пресет и новый User-Agent не обеспечивают полное совпадение. Публичные настройки позволяют менять часть поведения, но возможность заполнить конкретное недостающее расширение нужно проверять отдельно, у primp нет публичного полного конструктора ClientHello.
  • wreq-js / impit: неизвестный Chrome154 возвращает ошибку. У wreq-js есть настройки TLS/H2, но в проверенном API нет произвольного payload trust_anchors. Для impit готовый профиль берётся из native-каталога.
  • CycleTLS: ручные JA3/JA4R и H2 предусмотрены, однако конкретная попытка Chrome154 остановилась на неподдерживаемом расширении 51764. Здесь одной строкой отпечатка нужный ClientHello не собрать.
  • uTLS / req: публичный ClientHelloSpec и GenericExtension позволяют вручную описывать расширения, а req предоставляет настройку HTTP/2. Это штатный путь без правки библиотеки, но собственный профиль, согласованные заголовки и проверку возобновления должен сопровождать разработчик. Полная ручная реализация Chrome154 для этой пары в исследовании не выдаётся за измеренный результат.
  • got-scraping: ограничение генератора заголовков версией 154 принимается, но измеренные TLS/H2 остаются другими. Переход к текущему браузерному транспорту требует большего, чем настройки генератора.
  • httpcloak: готового chrome-154 нет. Мы штатно экспортировали latest-профиль через describe_preset, зарегистрировали пользовательский JSON с согласованными заголовками 154 через load_preset_from_json и выполнили четыре запроса. Свежий и resumed JA4, H2 и проверенные TLS-поля совпали, это подтверждённый пример настройки без переписывания библиотеки.

Таким образом, часть библиотек действительно позволяет собрать актуальный профиль самостоятельно. Разница с готовым продуктом - в том, кто отвечает за сбор эталона, проверку полей, согласование HTTP-слоя и дальнейшие обновления.

TLS resumption: проверяем поведение при возобновлении сессии

Сервер может выдать session ticket, после чего клиент создаёт новое соединение и пытается возобновить TLS-сессию. В TLS 1.3 это меняет ClientHello: появляется pre_shared_key с настоящим binder, он должен находиться последним расширением. Возможны и удаления других расширений. Повторять одинаковый «свежий» шаблон при каждом соединении - не то же самое, что воспроизводить поведение браузерной сессии. Механизм описан в RFC 8446, pre_shared_key.

У эталонного Chrome 154 свежий JA4 - t13d1517h2_8daaf6152771_cb7bf5808d99, при возобновлении - t13d1518h2_8daaf6152771_e2d80978ab2e. Добавляется расширение 41, базовая HTTP/2-сводка сохраняется. BlankTrail дал один свежий запрос и три принятых возобновления с этим переходом. Такой же переход по сводным значениям получили Go tls-client 152_PSK, noble-tls с этим ядром, wreq Chrome153, primp в полученных записях и httpcloak.

Обычный Go tls-client Chrome_152 без PSK-профиля в нашем прогоне дал четыре свежих рукопожатия. Это не означает, что ядро не умеет resumption: переключение на штатный Chrome_152_PSK изменило результат. Возможность и настройка конкретного режима должны оцениваться отдельно.

Свежий и возобновлённый TLS у Chrome154 и Firefox147, отличие повторного ClientHello curl_cffi.
Свежий и возобновлённый TLS у Chrome154 и Firefox147, отличие повторного ClientHello curl_cffi.

На Firefox различие тоньше. В эталоне Firefox 147 при возобновлении добавляется 41 и удаляется session_ticket 35: число учитываемых JA4 расширений остаётся 17, а свежий суффикс 3cbfd9057e0d меняется на e6dcd7ae0a9e. curl_cffi firefox147 сохранил 35 и добавил 41: получилось 18 расширений и суффикс 5dff20295fdc. При правильном свежем отпечатке повторное соединение отличалось от использованного эталона. BlankTrail Firefox147 воспроизвёл добавление 41 и удаление 35.

Отсутствие resumption в коротком прогоне зависит от ticket policy, настроек и кэша. Поэтому учитывалось принятие PSK сервером при сопоставимых условиях, а не только наличие расширения 41.

Проверим, как библиотеки работают с HTTP/3

HTTP/3 работает поверх QUIC/UDP и проверялся отдельно от TLS/H2: полный ClientHello из Initial, transport parameters, Initial/CID, SETTINGS, QPACK и порядок заголовков. Проверки включали нулевую и ненулевую QPACK capacity, новые соединения, PSK и ранний HTTP-запрос. Полнота байтового разбора указана для каждой конфигурации.

Эталоны - установленные Chrome154, Edge154.0.4258.48 и Firefox156.0.1 на Windows, Safari 26.6.2 на MacBook, а также захваты физических Android и iPhone. 

Настоящий браузерСвежий QUIC JA4Что важно в эталоне
Chrome154q13d0312h3_55b375c5d22e_178839b6cec1Есть trust_anchors, Initial1250 байт, DCID8 / SCID0.
Edge154q13d0311h3_55b375c5d22e_653d80c3fe9dtrust_anchors отсутствует, Initial1250, DCID8 / SCID0. Chrome с заменёнными заголовками не становится Edge.
Firefox156q13d0315h3_55b375c5d22e_bb76f32061e3Собственный набор TLS и QUIC parameters, Initial1252, DCID8 / SCID3.
Safari 26.6.2 macOSq13d0311h3_55b375c5d22e_f2a83c8e78aeInitial1200, DCID8 / SCID0, H3 SETTINGS: QPACK capacity16383, blocked streams100 плюс GREASE.

Нормализовали случайные значения GREASE, ключевые данные и идентификаторы соединений. Список trust_anchors сравнивали по идентификаторам, а не по случайному порядку, Root Store может обновляться отдельно от номера браузера. В Chrome QUIC из этого эталона нет того GREASE в signature_algorithms, который присутствует в его TCP ClientHello: переносить правило одного протокола на другой нельзя.

HTTP3: установленный протокол и точность браузерного отпечатка - отдельные проверки. Результаты измеренных конфигураций.
HTTP3: установленный протокол и точность браузерного отпечатка - отдельные проверки. Результаты измеренных конфигураций.

Как читать: ✓ - успех по указанному критерию, ✕ - отличие или цель не достигнута, △ - частичный результат или ограниченный объём подтверждения. TLS, TP, Initial/CID, SETTINGS и QPACK сравниваются с Chrome154 в обозначенной конфигурации, отличия других браузерных профилей указаны справа. Если H3 не работает, остальные ✕ означают недоступность результата, а не измеренные дефекты каждого поля. Для отказа0-RTT △ означает ответ без попытки ранних данных, поэтому восстановление не подтверждено.

Решение / режимH3 работаетTLS-поляQUIC TPInitial / CIDSETTINGSQPACKHTTP в 0-RTTОтказ 0-RTTДефекты и итог проверки
curl_cffi
V3ONLY / chrome150
✓✕△✕✓△✕△Нет trust_anchors, Initial1200 вместо1250, раннего HTTP нет. Edge101, Firefox147 и Safari260 также имеют сырые отличия от целевых версий.
Go tls-client
protocol racing / 152_PSK
✓✕✕✕✕✕✕✓Лишние TLS-расширения, Initial1280, иные CID, SETTINGS только51=1, QPACK иначе кодирует ?0. 1+3 вместо2+2, HTTP не ранний. 144_PSK улучшает SETTINGS, но не весь отпечаток.
noble-tls
native1.16.0 / 152_PSK
✓✕✕✕✕△✕✓Другие ClientHello, CID и SETTINGS, QPACK отдельно полностью не подтверждён. В protocol racing первый GET дублируется по H2/H3, HTTP не ранний.
httpcloak
http_version=h3 / latest
✓✓✓✓✓△✕✕В проверенных Chrome TLS/TP/Initial/SETTINGS дефектов не найдено, полная QPACK-точность не доказана. После простоя q/qd и при отказе0-RTT - ошибки. Firefox отличается, Safari iOS ограничен соответствующим эталоном.
impit
forceHttp3 / chrome151
✓✕△✕✕△✕△Иные шифры/расширения, Initial1200, CID20/8, SETTINGS с MAX_FIELD_SECTION_SIZE=2⁶²−1. PSK работает, раннего HTTP нет. Firefox144 и Chrome с Edge UA тоже не воспроизвели цель.
CycleTLS
forceHTTP3 / custom JA3
✓✕△✕△△✕△JA3 не воспроизводит QUIC: другие расширения, группы, сигнатуры, Initial1280, иные CID. Новое fresh-соединение на каждый GET, PSK/0-RTT нет.
req/v3
EnableForceHTTP3
✓✕△△✕△✕△Другие TLS-группы/сигнатуры, расширение50, SETTINGS6=10485760. После закрытия сервером новое соединение без PSK, раннего HTTP нет.
wreq Python
HTTP_3
✕✕✕✕✕✕✕✕H3 не установлен: NO_APPLICATION_PROTOCOL. Успешного HTTP/3-отпечатка для сравнения нет.
rnet
HTTP_3
✕✕✕✕✕✕✕✕H3 не установлен: UserUnsupportedVersion.
wreq-js, primp, Python tls-client, HTTPX, requests, Node fetch, got-scraping
Проверенные пакеты/API
✕✕✕✕✕✕✕✕Нет рабочего QUIC в проверенных конфигурациях, запросы остались на TCP/H2 или H1.
uTLS + Go HTTP/2, Go net/http
Проверенные транспорты
✕✕✕✕✕✕✕✕TCP-транспорты, для H3 требуется другой QUIC/HTTP3-клиент.
Windows curl
Schannel / --http3-only
✕✕✕✕✕✕✕✕Сборка не поддерживает HTTP/3, флаг отвергается. К curl_cffi это не относится.
BlankTrail Proxy
1.3.15 / шесть профилей
✓✓✓✓✓✓✓✓Дефектов в проверенных полях и сценариях не найдено. 342 QUIC-соединения основной серии, текущая проверка поведения -72 успешных запроса и36 соединений. QPACK/GREASE и ранний HTTP подтверждены, живой отказ0-RTT проверен на Chrome.

Углубимся в анализ сырых байтов HTTP/3

ClientHello собирался из всех CRYPTO-фрагментов QUIC Initial. Библиотечная байтовая выборка содержит 25 соединений и 54 блока заголовков, для неё сохранены порядок TP, окна, stream limits, Initial и CID.

SETTINGS сохранялись до преобразования в map, QPACK - до декодирования в пары имя/значение. Это сохраняет реальный порядок и способ кодирования, которые обычный JSON-журнал может скрыть.

✓ - проверенные поля совпали с указанным эталоном, ✕ - найдено отличие, △ - ограниченное подтверждение, которое не засчитывается как полное совпадение. Отметки относятся к конкретному профилю и выборке. В значениях ниже max означает 2⁶²−1.

КонфигурацияЭталонTLS-поляQUIC TPInitial / CIDSETTINGSQPACKКонкретные отличия и итог
curl_cffi / Chrome150Chrome154✕△✕✓△Нет trust_anchors51764, Initial1200 вместо1250. Постоянные SETTINGS и их порядок совпали. Полная QPACK-точность не подтверждена.
curl_cffi / Safari260Safari 26.6.2 Mac✕△✕✕△Другие groups, key_share и supported_versions. CID20/20 вместо8/0, SETTINGS6=max →1=0 →7=0 вместо QPACK capacity16383 и blocked streams100.
curl_cffi / Edge101Edge154✕△△✕△Иной TLS, SETTINGS6=max →1=0 →7=0. Устаревший пресет не воспроизвёл текущую цель.
curl_cffi / Firefox147Firefox156✕✕△△△Другие шифры, группы и параметры QUIC. Остальные поля не получили полного подтверждения.
Go tls-client / 152_PSKChrome154✕✕✕✕✕TCP-подобные TLS-расширения, Initial1280. SETTINGS только51=1 вместо1/6/7/51 + GREASE. QPACK кодирует ?0 с другим Huffman-флагом.
Go tls-client / 144_PSKChrome154✕△△✓✕SETTINGS и порядок совпали, но TLS/QUIC154 - нет. QPACK: другой Huffman-флаг для ?0. Старый пресет исправил лишь часть полей.
noble-tls / native1.16.0Chrome154 / Safari26✕△✕✕△Другие ClientHello, CID и SETTINGS. Полный QPACK обёртки отдельно не подтверждён, результаты Go нельзя автоматически переносить на неё.
httpcloak / Firefox-latestFirefox156✕✕△△△Другой TLS. Окна TP4=15728640 и5/6/7=6291456 вместо25165824,12582912,1048576,1048576.
httpcloak / Chrome-latestChrome154✓✓✓✓△В проверенных TLS-полях, наборах TP, Initial/CID и SETTINGS дефектов не найдено. Полная QPACK-точность не подтверждена, поведенческие ошибки указаны в общей H3-таблице.
httpcloak / Safari iOSОграниченный Mac-эталон△△△△△Окна QUIC отличаются от измеренного macOS Safari. В этой байтовой выборке отдельного iPhone-эталона не было: это не доказанный дефект iPhone-профиля.
impit / Chrome151Chrome154✕✕✕✕△15 шифров вместо3 TLS1.3, TP4=max,5/6/7=1250000 вместо15728640 и6291456. Initial1200, иной SETTINGS.
CycleTLS / Chrome154 JA3Chrome154✕✕✕△△Другой ClientHello, TP4=1048576,5/6/7=524288 вместо15728640 и6291456. Initial1280. Пользовательская JA3 не стала точным QUIC-профилем.
req/v3 / ForceHTTP3Chrome154✕✕△✕△Иной TLS, включая extension50. TP4=786432, streams_bidi8=0 вместо100. SETTINGS только6=10485760 вместо262144 и1/7/51/GREASE.
BlankTrail / 1.3.15Шесть проверенных профилей✓✓✓✓✓Дефектов в проверенных полях не найдено: TLS, нормализованные TP, Initial/CID, SETTINGS и QPACK соответствуют сохранённым эталонам. Safari: fresh/PSK/0-RTT, Initial1200, Chromium: encoder stream10.

Допустимый по протоколу параметр может отличаться от браузерного: например, Initial1200 или другое окно QUIC не являются ошибкой протокола, но мешают воспроизвести выбранный эталон. Это не доказывает неизбежное обнаружение антифродом, но показывает что это потенциально возможно.

SETTINGS: конкретный пример расхождения
Chrome154 / Edge154: 1=65536 → 6=262144 → 7=100 → 51=1 → GREASE
Go tls-client / 152_PSK: 51=1
req/v3 / ForceHTTP3: 6=10485760

Отсутствие параметров у152_PSK не объясняется перемешиванием GREASE. Пары ID/value и их порядок сравнивали до преобразования в map. Формат описан в RFC9114, способ самостоятельного захвата - ниже.

QPACK: одинаковые заголовки могут кодироваться по-разному

У настоящих Chrome154 и Edge154 заголовок sec-ch-ua-mobile: ?0 передан без Huffman-кодирования значения, у Go tls-client с профилями152_PSK и144_PSK - с ним. Оба варианта корректны, но байты отличаются от эталона.

Для такого сравнения нужны одинаковые значения заголовков и контекст запроса. Различие curl_cffi для platform не считали дефектом: сравнивались macOS и Windows. Исходные 54 QPACK-блока сняты при capacity0, динамическую таблицу и encoder/decoder streams проверяли отдельно с ненулевой capacity по RFC9204.

Поведение HTTP/3 проверяли четырьмя GET в одной сессии с паузами 2, 42 и 2 секунды, при автоматическом и принудительном выборе H3: q/qd - без 0-RTT, с QPACK capacity0/65536, qz - с разрешённым 0-RTT.

PSK, принятый 0-RTT и ранний HTTP-запрос - три разных результата. Расширение pre_shared_key только предлагает возобновление. Сервер отдельно подтверждает принятие PSK и ранних данных, ещё отдельно проверяется, был ли поток с самим GET открыт в 0-RTT. У Go tls-client и noble-tls сервер принял ранние данные, но GET ушёл после рукопожатия. Поэтому одного флага used_0rtt недостаточно.

КлиентВыбор и жизнь соединенияHTTP в 0-RTTОтказ 0-RTTРезультат и ограничения
BlankTrail ProxyChrome/Edge: H3 сразу, 2+2 запроса, Firefox: сначала TCP. После простоя - PSK.✓✓Все 6 профилей отправили ранний HTTP-запрос. 72 запроса без ошибок, 36 QUIC-соединений без различий в проверенных сырых полях.
curl_cffiH3 сразу в режиме V3, 2+2 запроса, после простоя - PSK.✕△В проверенном Chrome150-профиле ранние данные не предлагались. Сырые отличия от 154 остаются.
Go tls-clientH3 сразу, 1+3 запроса: новое resumed-соединение уже для второго GET, затем оно пережило простой.✕✓0-RTT принят сервером, но HTTP-запрос не был ранним. Сырые TLS/QUIC и SETTINGS отличаются.
noble-tlsТа же H3-последовательность 1+3, первый GET также отправлен по H2.✕✓В трёх режимах первый GET продублирован по H2 и H3 при protocol_racing=True. Раннего HTTP-запроса нет, сырые QUIC-отличия остаются.
httpcloakauto: все запросы по TCP. forced H3: после простоя q/qd - ошибки, qz - 2+2.✕✕4 ошибки из 24 обычных попыток. При отказе 0-RTT - ошибка, два штатных повтора её не устранили.
impitH3 сразу при http3=True, 2+2 запроса, после простоя - PSK.✕△Ранние данные не предлагались, сырые отличия от выбранного браузера остаются.
req/v3auto: первый запрос по TCP, затем H3. forced: одно H3-соединение сохранилось через простой.✕△При принудительном закрытии сервером новое соединение тоже было fresh: PSK/0-RTT в проверенной конфигурации не получены.
CycleTLSauto: TCP, forced H3: новое соединение на каждый из четырёх запросов.✕△PSK и ранних данных нет. Запросы успешны, но переиспользование и сырые поля отличаются от Chrome/Edge.

В столбце «Отказ 0-RTT» ✓ означает успешную доставку запроса после отклонённой попытки ранних данных, ✕ - ошибку, △ - успешный запрос без самой попытки 0-RTT, поэтому механизм восстановления не проверен этим клиентом. Для проверки сервер сохранял ticket keys и возможность PSK, закрывал прежнее соединение, но запрещал ранние данные. BlankTrail, Go tls-client и noble-tls получили ответ по возобновлённому соединению без принятого 0-RTT. httpcloak завершился ошибкой 0-RTT rejected, следующий запрос - tls: illegal parameter. Штатные retry=2 также не восстановили запрос.

У noble-tls обнаружен дублирующий GET. В каждом из трёх автоматических режимов сервер обработал один и тот же первый URL по HTTP/2 и HTTP/3: при четырёх запланированных запросах получал пять. У прямого Go tls-client в этой серии дубликата не было. Результат относится к GET и protocol_racing=True, поведение POST этим опытом не проверялось.

Жизнь HTTP/3-соединений в одинаковом четырёхзапросном сценарии. Полные условия и ограничения - в таблице.
Жизнь HTTP/3-соединений в одинаковом четырёхзапросном сценарии. Полные условия и ограничения - в таблице.

В одинаковом fetch-сценарии настоящие Chrome и Edge использовали два свежих H3-запроса, после простоя - два по новому resumed-соединению, в qz первый из них был ранним. BlankTrail с соответствующими профилями повторил эту последовательность. У Safari и Firefox выбор первого транспорта зависел от сохранённых соединений и объединения origin: Safari в q сохранил TCP, а в qd/qz использовал H3. Поэтому сам по себе первый TCP-запрос не считается универсальным дефектом всех браузерных профилей.

В текущем прогоне BlankTrail проверены Chrome154 Windows/Android, Edge154, Firefox156 и Safari 26 macOS/iPhone: все 72 запроса завершились, в 36 QUIC-соединениях совпали проверенные постоянные TLS-поля, transport parameters, Initial/CID, SETTINGS, управляющие потоки и QPACK. В qz ранний HTTP-запрос получен у всех шести профилей. Прогон и отказ 0-RTT выполнены на тестовом билде 1.4.1064, изменения которого предназначены для релиза 1.3.15. Это подтверждение конкретных сценариев, а не статистики частот всех перестановок или поведения при любом состоянии сети.

Edge и Firefox: проверка текущей цели, а не названия пресета

В HTTP/2-сценариях запросили Edge154 и Firefox156 с доступными профилями. curl_cffi edge101 и rnet Edge134 отличаются TLS от Edge154, wreq-js Edge148 не является готовым 154. primp Edge151 дал совпавший краткий детект, но сырые сигнатуры и ALPS отличаются. Chrome-профиль httpcloak с правильными Edge-заголовками сохранил лишний trust_anchors. Firefox147/148/151 у библиотек не считается полным совпадением 156: в сырых сравнениях различаются шифры/группы. Отсутствие ошибки в кратком JSON не перекрывает это отличие.

Дополнительно проверим качество профилей Safari, iOS и Android

Мобильный User-Agent не заменяет мобильный транспорт. Сравнение учитывает Safari 26 macOS/iPhone и Chrome154 Android, а не только название пресета.

КлиентSafari macOSSafari iPhoneChrome AndroidSafari: результат и отличияAndroid: результат и отличия
curl_cffi✕✕✕safari260 / safari260_ios: HTTP/2 совпал, TLS отличался, в iOS-пресете присутствовал session_ticket 35 и padding 21, которых нет в свежем эталоне сравнения.chrome131_android: старый TLS-класс, не совпал с целью 154.
wreq Python△△△Safari26 и SafariIos26: свежие JA4/H2 совпали. За четыре запроса с каждого пресета принятый resumption не наблюдался.Chrome153 + Platform.Android: JA4/H2 совпали с классом 154, но trust_anchors пуст и Client Hints оставались 153.
wreq-js△△✕safari_26 / safari_ios_26: свежие JA4/H2 совпали, стандартный пресет не возобновил сессию. Отдельная попытка включить PSK публичными overrides не дала совпадения с эталонным профилем.chrome_149 + android: HTTP/2 совпал, свежий TLS отличался.
primp△△△safari_26 + macos/ios: JA4/H2 совпали в полученных записях, resumption наблюдался, сырой ClientHello отличается присутствием GREASE, порядком и содержимым части полей. Ответы прогона неполные.chrome_153 + android: сводки совпали, но остаются различия постоянных TLS-полей и версии Client Hints.
Go tls-client 1.16.0✕△△Прямой Go API: safari_ios_26_0 дал совпавшие свежие JA4/H2, в четырёх запросах PSK не наблюдался. safari_16_0 с заявленной macOS Safari26 отличается по TLS и H2, готового macOS26 в проверенном каталоге нет.chrome_131 с мобильными заголовками 154: TLS отличается, H2 совпал. Chrome_152_PSK с согласованными заголовками Android154: свежие и resumed JA4/H2 совпали, проверенные постоянные TLS-поля совпали с используемым эталонным транспортным классом.
noble-tls / native 1.16.0✕△△safari_ios_26_0: свежие JA4/H2 совпали, PSK в коротком прогоне не наблюдался. Старый macOS safari_16_0 не совпал с целью 26.chrome_131 с мобильным UA: свежий TLS не совпал. Штатный chrome_152_PSK и согласованные заголовки Android154 дали совпавшие fresh/resumed JA4/H2 и проверенные постоянные TLS-поля.
httpcloak✕△△Для iOS latest TLS-сводка соответствовала Safari26, но H2 отличался порядком SETTINGS, окном и псевдозаголовками. Имя safari-latest-macos отсутствует, отдельный macOS-профиль 26 этим тестом не подтверждён.chrome-latest-android: JA4/H2 совпали с классом 154, требуется обновление HTTP-заголовков из исходного пресета 152.
impit✕✕✕Safari отсутствует в проверенном Browser enum Node-пакета.chrome151 с мобильным UA: TLS/H2 отличались, отдельного параметра Android-платформы в этом тесте не было.
BlankTrail✓✓✓Safari_26_macOS и Safari_26_iPhone: TCP/H2 сохраняет свежий WebKit-отпечаток безPSK. В HTTP3 после простоя появляется 41 и JA4 меняется как в QUIC-эталоне Safari 26.6.2.Chrome_154_and: свежий и resumed JA4/H2 совпали, проверенные постоянные TLS-поля совпали с использованным эталоном класса Chrome154.

Цели: Safari26 и Chrome154 Android. ✓ - совпало в проверенной конфигурации, ✕ - целевой профиль не воспроизведён, △ - частичное совпадение или требуется настройка. Совпадение JA4/H2 без подтверждения сырых полей не получает зелёную отметку. Штатная ручная настройка Go tls-client и noble-tls дала совпадение проверенных TCP/TLS-полей Android, но не закрывает всю эмуляцию, включая HTTP/3.

Safari: настоящий 26.6.2 в проверенных новых TCP-соединениях не использовал PSK, но возобновлял QUIC. Поэтому отсутствие TCP-resumption не считается дефектом, а PSK у curl_cffi и primp в Safari-сценарии отличается от измеренного поведения.

iOS: проверенные CriOS/FxiOS/EdgiOS-пути BlankTrail используют WebKit/Safari-транспорт. Требовать от них настольный Chromium/Gecko ClientHello неверно, найденные замечания классификатора отделены от дефектов клиента.

Android: физический Chrome154 подтвердил PSK, ранний HTTP в0-RTT и QPACK encoder stream10. BlankTrail воспроизвёл проверенные поля и эти сценарии, ограничения библиотечных профилей показаны в таблице.

Подробные захваты Safari/iOS/Android, GREASE и QPACK

Повторные TCP/H2-соединения Safari: единая проверка всех клиентов

Safari проверен у всех 20 решений, включая обычный транспорт с Safari User-Agent там, где готового профиля нет. Клиент и его кэш сохранялись между запросами, серверный журнал подтверждал новые соединения.

Настоящий Safari 26.6.2 не предложил TCP PSK ни в прогоне safaridriver, ни в обычном окне после принудительных закрытий. Контрольный Go-клиент на том же сервере возобновился. Поэтому отсутствие Safari TCP resumption не штрафуется само по себе: оно оценивается вместе с соответствием fresh TLS/H2. Старый Safari16 без PSK от этого не становится Safari26.

Клиент / доступный Safari-профильНовые соединения / PSKВывод
BlankTrail: Safari 26 macOS / iPhone4+4, PSK0, accepted0Повторные полные TLS/H2 соответствуют выбранному Safari26-классу, недостаток подтверждения снят.
Go tls-client: iOS26, macOS164+4, PSK0iOS26: свежие сводки соответствуют 26, macOS16 сохраняет устаревший TLS-профиль.
noble-tls: iOS26, macOS164+4, PSK0Тот же результат ядра, отсутствие PSK не исправляет старый macOS-пресет.
wreq26.4 / wreq-js26.44+4, PSK0Свежие Safari-сводки и отсутствие PSK соответствуют выбранному поведению, это не отменяет других сырых ограничений.
httpcloak Safari iOS4, PSK0Повторное полное рукопожатие, измеренное отличие H2 от Safari остаётся.
rnet Safari18.54, PSK0Свежая сводка соответствует классу 26, возраст пресета и сырые отличия сохраняются.
curl_cffi Safari2604, предложено/принято PSK3Свежий TLS уже отличается, три повторных ClientHello возобновились, в отличие от выбранного Safari 26.6.2.
primp Safari26Получены 2 соединения из 4 попыток, PSK1 принятПовторный ClientHello содержит 41 и сервер принял resumption, ещё два ответа потеряны при закрытииH2. Счёт неполного прогона не скрыт.
Python tls-client Safari15.6.14, PSK0Устаревший свежий TLS не соответствует 26.
impit, CycleTLS, req/v3, uTLS+GoH2, got-scrapingПо 4 ответа, точный Safari26 не полученИспытанные fallback/обычные транспорты не заменяют отсутствующий актуальный Safari-пресет. PSK у небраузерного транспорта не оценивается как отдельный дефект Safari-профиля.
requests, HTTPX, Go net/http, Windows curl, Node fetchПо 4 попытки, HTTPX получил 2 ответаКонтроли с Safari User-Agent, эмуляцияSafari не заявлена и не получена.

iOS: название браузера и транспортный движок

Для BlankTrail1.3.15 измерены database-фильтры chrome+ios, firefox+ios, edge+ios и safari+ios, а также подбор по User-Agent с CriOS, FxiOS, EdgiOS и EdgiOS на iPad. Во всех восьми путях получен один WebKit/Safari-транспортный класс. Бренд и версия в UA различаются, это не означает, что iOS-профиль должен отправлять настольный Chromium или Gecko ClientHello.

Путь выбора профиляНовые TCP-соединенияИзмеренный TLS/H2PSK41
database chrome+ios / firefox+ios / edge+ios / safari+iosПо 3, всего 12Safari JA4 t13d2013h2_a09f3c656075_7f0f34a4126d, H2 m,s,a,pНет во всех 12
По UA: CriOS / FxiOS / EdgiOS / EdgiOS iPadПо 3, всего 12Тот же Safari JA4 и H2Нет во всех 12
Контроль Chrome Windows3Fresh t13d1517h2…cb7bf5808d99 → PSK t13d1518h2…e2d80978ab2e, Chromium H2 m,a,s,pЕсть в двух повторных ClientHello

Все 24 TCP-записи восьми iOS-путей дали H2 2:0;3:100;4:2097152;9:1|10420225|0|m,s,a,p. UA содержали соответствующие CriOS/FxiOS/EdgiOS-токены. Это проверка выбора профиля продуктом, а не 24 запуска физических iPhone/iPad.

В актуальном iOS-прогоне исследовательский /client получил 24 ответа:21 с CriOS/FxiOS/EdgiOS содержал engine_mismatch, а для CriOS/EdgiOS также client_hints_absent. На публичном /client отдельно проверены восемь сценариев:семь воспроизвели эти ложные замечания, Safari прошёл. Серверные записи показывают ожидаемый WebKit/Safari TLS/H2, требование настольного Chromium/Gecko и desktop Client Hints здесь относится к ошибке классификации детектора, а не к выявленному дефекту продукта.

Safari HTTP/3: свежая и PSK-форма - отдельный эталон

В отличие от TCP, сохранённый QUIC-эталон Safari 26.6.2 содержит свежую форму и два варианта возобновления: с 0-RTT и без него. BlankTrail воспроизвёл эти состояния с сохранением кэша после простоя.

СценарийQUIC JA4РасширенияInitial
Живой Safari 26.6.2: freshq13d0311h3_55b375c5d22e_f2a83c8e78aeНет 41/421200
Живой Safari: PSK без 0-RTTq13d0312h3_55b375c5d22e_151122171f7d41 последний, нет 421200
Живой Safari: PSK с разрешённым 0-RTTq13d0313h3_55b375c5d22e_6bb9a3ac9a4b42 между 45 и 43,41 последний1200
BlankTrail Safari 26 macOS / iPhoneВ каждом профиле fresh…f2a83c8e78ae → PSK…151122171f7dПорядок,41 последний и отсутствие 42 совпали с выбранным вариантом эталона1200 во всех 4 QUIC-соединениях

У Safari macOS/iPhone сравниваемые шифры, группы, алгоритмы подписи, версии, форма key_share, постоянные тела расширений и значения TP совпали с QUIC-эталонами после нормализации случайных данных.

Fresh wire order:

GREASE,0,10,16,5,13,18,51,45,43,57,27,GREASE

PSK без 0-RTT:

GREASE,0,10,16,5,13,18,51,45,43,57,27,GREASE,41



Наблюдаемые порядки transport parameters:

14 15 4 5 6 7 9

9 14 15 4 5 6 7

4 5 6 7 9 14 15

Порядок Safari TP -циклические повороты последовательности 4,5,6,7,9,14,15, а не произвольное перемешивание. Все снятые порядки продукта входят в это семейство.

В Safari macOS и iPhone подтверждены не только tls_resumed и used_0rtt, но и байты самого HTTP-запроса в ранних данных. При замере с задержкой ответа сервера Early-Data:1 стоит последним заголовком повторного запроса, в свежем его нет.

В актуальном прогоне BlankTrail все 342 QUIC-соединения шести профилей прошли перечисленные проверки постоянных TLS-полей, TP, SETTINGS, Initial/CID и QPACK-потоков. Chromium передаёт 12583 после накопления RTT origin, Firefox сохраняет фиксированный 0xff02de1a (min_ack_delay), который нельзя считать случайным GREASE.

Условия H3-замеров:

Включены h2_spoofing, enable_http3 и spoof_headers, профиль задан явно, UA взят из каталога. Исходный клиент передаёт контекст через Sec-Fetch-Dest/Mode/Site.

Первый QPACK-блок зависит от момента получения SETTINGS. В шести контрольных запусках настоящего Chrome154.0.8037.95 первый блок был динамическим, NetLog подтвердил SETTINGS до заголовков. Поэтому динамический первый блок продукта сам по себе не является дефектом.

Форма HTTP/3, GREASE и QPACK шести профилей

Перемешивание проверено на 300 свежих HTTP/3-соединениях: по 50 для Chrome154 Windows/Android, Edge154, Firefox156 и Safari 26 macOS/iPhone. Для каждого профиля 25 соединений использовали серверную QPACK capacity0 и 25 -capacity65536.

Проверяемая частьChrome / EdgeFirefoxSafari macOS / iPhone
Постоянные TLS-поля и SETTINGSСовпали во всех 100 соединенияхСовпали во всех 50 соединенияхСовпали во всех 100 соединениях, macOS сравнивается с отдельным эталоном
Initial и CID1250/1250, DCID8, SCID01252/1252, плавающий DCID, SCID31200/1200, DCID8, SCID0
TP и TLS-порядкиПо 50 различных порядков TP, меняются GREASE и порядок QUIC-версийTP постоянны, TLS перемешивается с хвостом 57,65037Все три допустимых поворота TP, чужих порядков нет
Кадры после SETTINGSGREASE с телом 0–3 байта и PRIORITY_UPDATEGREASE с телом 0–7 байт, без PRIORITY_UPDATEЛишних кадров нет
QPACK при capacity0Статический блок, только управляющий потокСтатический блок, управляющий и оба QPACK-потокаСтатический блок, только управляющий поток
QPACK при capacity65536Вставки, динамические ссылки, encoder stream10Вставки и оба QPACK-потокаКодировщик отправляет ёмкость сервера, запрос остаётся статическим

Chromium дал 50 разных порядков TLS и TP на профиль и оба порядка available_versions, Firefox -50 порядков TLS при фиксированном TP, Safari -фиксированный TLS и три эталонных TP-порядка. Все 300 свежих соединений прошли структурные проверки. PSK и ранний HTTP проверены повторными соединениями.

Для Edge и Firefox восемь двухвыборочных KS-проверок по сохранённым 100 и 120 браузерным соединениям при уровне 0,01 не отвергли совпадение отдельных распределений, минимальное p=0,029. Это не доказывает равенство совместного распределения. Актуальный прогон проверяет структуру и вариативность, но не повторяет эти KS-вычисления.

Chrome154 Android: сравнение с физическим устройством

Захват физического Android154 содержит fresh и resumed q/qd/qz: в q/qd принят PSK без 0-RTT, в qz -PSK и 0-RTT с подтверждённым ранним HTTP-запросом.

При сравнении Android с BlankTrail совпали проверенные TLS-поля, нормализованные TP, постоянные SETTINGS и порядок заголовков. Initial1250/1250, DCID8, SCID0.

СценарийНастоящий Android Chrome154BlankTrail1.3.15
qd: динамическая таблицаУправляющий stream2, кодировщик QPACK stream10Управляющий stream2, кодировщик QPACK stream10 - совпало
qz: статическая формаТолько управляющий stream2Только управляющий stream2 - совпало
qz: повтор после простояPSK/0-RTT приняты, запрос в 0-RTTPSK/0-RTT приняты, запрос в 0-RTT - совпало

Chromium encoder stream10 подтверждён реальным desktop Chrome и Android. BlankTrail воспроизвёл его у Chrome Windows, Edge Windows и Chrome Android в 25 свежих соединениях с динамической таблицей на профиль и в повторных соединениях.

BlankTrail: браузерный транспорт для старого и стороннего ПО

На Linux curl 7.74.0 через BlankTrail получены проверенные профили Chrome154, Edge154, Firefox156 и Safari26. Старый клиент не меняли: выбранный TLS/H2/H3-транспорт формирует прокси.

Измеренный сценарий: старый curl через BlankTrail получает выбранный браузерный TLS/H2-транспорт.
Измеренный сценарий: старый curl через BlankTrail получает выбранный браузерный TLS/H2-транспорт.

Плюс: подключение разных стеков и стороннего ПО без исходников и интеграции native-библиотеки. Минус: отдельное приложение, которое нужно установить, запустить и сопровождать. Для HTTPS-подмены клиент должен доверять CA, certificate pinning может препятствовать работе.

В статье используется версия 1.3.15. Обновление базы не позднее 5 дней выхода стабильного браузера - заявленный регламент BlankTrail. Из 841 профиля каталога в данном исследовании проверена перечисленная выборка, но весь каталог снимался и тестировался против соответствующих версий реальных браузеров на реальных устройствах и нужных OS.

Параметры TCP-опыта и измеренные JA4/H2

Это проверено на Linux curl 7.74.0 с OpenSSL: тот же клиент через BlankTrail выдал профили Chrome154, Edge154, Firefox156, Safari26 и более ранних версий. Для каждого профиля открывался новый тестовый порт с пустым кэшем TLS. H2 spoofing и session resumption были включены, HTTP/3 и browser_mode - выключены. После смены профиля тест начинался заново - tickets предыдущего профиля не использовались как «свежее» соединение.

Ниже - конкретные измеренные отпечатки трёх профилей BlankTrail. Строка HTTP/2 записана в формате Akamai: SETTINGS в порядке отправки, WINDOW_UPDATE соединения, сводка приоритетов и порядок псевдозаголовков. Обозначения m, a, s, p означают :method, :authority, :scheme, :path. У Chrome/Firefox HTTP2 сохраняется после TLS resumption, у Safari - после повторного полного handshake.

В каталоге 841 профиль, живые тесты охватывают перечисленную выборку, а не весь каталог.

Chrome_154_win

fresh:   t13d1517h2_8daaf6152771_cb7bf5808d99

resumed: t13d1518h2_8daaf6152771_e2d80978ab2e

HTTP/2:  1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p



Firefox_156_win

fresh:   t13d1517h2_8daaf6152771_3cbfd9057e0d

resumed: t13d1517h2_8daaf6152771_e6dcd7ae0a9e

HTTP/2:  1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s



Safari_26_macOS

fresh:   t13d2013h2_a09f3c656075_7f0f34a4126d

repeat:  t13d2013h2_a09f3c656075_7f0f34a4126d (full handshake; no PSK)

HTTP/2:  2:0;3:100;4:2097152;9:1|10420225|0|m,s,a,p

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

  1. Снимите результат настоящего целевого браузера и проверяемого клиента на tls.peet.ws/api/all, сохраните версии, профиль, ОС и JSON.
  2. Получите краткий детект на BlankTrail /client. Он помогает найти противоречия, но не подтверждает равенство всех байтов.
  3. Сравните фактический протокол, TLS-поля, SETTINGS и заголовки. При одинаковом JA4 проверьте payload расширений, включая trust_anchors.
  4. Проверьте новые соединения с сохранённым кэшем сессии. Для H3 отдельно различайте PSK, принятый0-RTT и сам ранний HTTP-запрос.
Подробная инструкция: pcap, ключи сессии, QPACK и тест отказа 0-RTT

BlankTrail /client даёт короткий результат: распознанный популярный клиент, заявленный браузер и найденные противоречия. Сохраните JSON, версию клиента, пресет, ОС и дату. Это удобный первый шаг, отсутствие findings не доказывает совпадение всех байтов.

  1. Получите независимый подробный результат. Откройте tls.peet.ws/api/all настоящим целевым браузером, затем запросите тот же URL библиотекой. Сохраните оба JSON. Сервис описан в репозитории TrackMe, /api/all возвращает собранные TLS и HTTP-поля. Не сравнивайте браузерную навигацию и библиотечный fetch без поправки на контекст HTTP-заголовков.
  2. Начните с транспорта. Проверьте http_version и negotiated ALPN. В TLS сравните ciphers, extensions, supported_versions, supported_groups, signature_algorithms, key_share, ALPS и compression. JA3/JA4/PeetPrint используйте как сводки, при одинаковом хеше отдельно смотрите содержимое расширений, включая trust_anchors. В HTTP2 сравните akamai_fingerprint и sent_frames: SETTINGS, WINDOW_UPDATE, псевдозаголовки и обычные заголовки. Набор полей зависит от действительно использованного протокола.
  3. Не считайте закономерную случайность дефектом. Значения GREASE нормализуйте, сохраняя их количество и позиции, для Chrome/Edge снимите несколько новых соединений и проверьте перемешивание. random, session ID, ключевые байты key_share, билеты и binder не должны повторяться. Сравнивайте группы и длины ключей, а trust_anchors - по допустимому набору ID с учётом версии Root Store. Порядок, фиксированный у выбранного эталона, проверяйте отдельно.
  4. Для настоящих сырых байтов сделайте свой захват. /api/all показывает разобранные поля, а не полный pcap каждого запроса. В Wireshark захватите TCP443 и UDP443 своего клиента. TCP ClientHello разбирается по TLS record и handshake, QUIC ClientHello нужно восстановить из CRYPTO-фрагментов Initial, а не принять один UDP-пакет за полный TLS. Для HTTP2/HTTP3 нужны ключи сессии: в поддерживающем это клиенте включите key log, затем укажите файл в TLS-настройках Wireshark. Порядок описан в документации Wireshark TLS, поля QUIC - в справочнике dissector. Публичный JSON не заменяет этот шаг.
  5. Повторите fresh и новое соединение в той же сессии. Оставьте клиентский session cache, дождитесь билета и закройте соединение со стороны своего сервера, сохранив ticket keys. Новый HTTP-запрос по старому H2/H3 не является resumption. PSK41 в ClientHello означает предложение, факт принятия подтвердите выбранной PSK identity в ServerHello или серверным DidResume. Для Safari 26.6.2 разделяйте TCP/H2 и QUIC/H3. В выбранном TCP-эксперименте новые соединения шли без 41. QUIC-эталон возобновляется: без 0-RTT добавляется только 41, с разрешённым 0-RTT добавляется также 42. Сравнивайте соответствующий протокол и политику сервера.
  6. HTTP3 проверяйте отдельно. Включите штатный H3-режим, используйте рекламу Alt-Svc/HTTPS record и убедитесь, что ответ действительно пришёл по H3. Для независимого публичного разбора попробуйте tls3.peet.ws/api/all, сам адрес не гарантирует QUIC, проверяйте фактический http_version. В pcap сравните TLS, полный payload transport parameters, размер первого Initial, CID, SETTINGS и порядок заголовков. После расшифровки сохраните SETTINGS type4 до перевода в map: сравните порядок пар ID/value и GREASE отдельно. Для HEADERS type1 сначала разберите QPACK-префикс и инструкции, затем сопоставьте декодированные значения, при одинаковых значениях сравнивайте static indices, literal/name-reference и Huffman/Never Index. Динамику QPACK проверяйте отдельным прогоном с ненулевой capacity сервера, несколькими запросами и учётом encoder/decoder streams. TCP-правила GREASE не переносите в QUIC автоматически.
  7. Поведение HTTP/3 измеряйте по соединениям. Отправьте четыре безопасных GET одним клиентом с паузами 2, 42 и 2 секунды, на своём сервере сохраните connection ID, протокол, stream ID и время каждого запроса. Повторите с capacity0/65536 и с разрешённым/запрещённым 0-RTT. Для отказа ранних данных сохраните ticket keys и PSK, но запретите early data, проверьте, что запрос доставлен после рукопожатия ровно один раз. Отдельно зафиксируйте предложение early_data, принятие сервером и открытие HTTP-потока в 0-RTT. Публичный /client даёт краткий детект, для такой временной последовательности нужны pcap с ключами сессии или журналы вашего HTTP/3-сервера.

Пример для curl_cffi: первый URL нужен для подробных полей, второй - для краткого детекта. Здесь выбран доступный chrome150, имя chrome не является обещанием поддержки 154.

from curl_cffi import requests

with requests.Session(impersonate="chrome150") as session:

    for url in ("https://tls.peet.ws/api/all",

                "https://audit.blanktrail.com/client"):

        response = session.get(url, timeout=20)

        print(response.json())

Для старого клиента через BlankTrail задайте порт с нужным профилем и соответствующий CA, отдельно сравните H2 и H3. Пример:

curl --proxy http://127.0.0.1:PROXY_PORT \

  --cacert /path/to/blanktrail-ca.crt \

  https://tls.peet.ws/api/all
Статический просмотр обезличенных реальных ответов детектора: requests, wreq и BlankTrail. Эти ответы относятся к TCP-проверке.
Статический просмотр обезличенных реальных ответов детектора: requests, wreq и BlankTrail. Эти ответы относятся к TCP-проверке.

На иллюстрации сохранены реальные краткие ответы /client из TCP-проверок, без IP и одноразовых имён. Их зелёный результат относится к TCP и не подтверждает совпадение HTTP/3.

Какие решения оказались сильнее

BlankTrail - первый по проверенному охвату текущих целей и готовности профилей. Из библиотек httpcloak ближе всего к Chrome QUIC по проверенным сырым полям, но имеет ошибки после простоя и при отказе 0-RTT. Go tls-client и noble-tls точно воспроизвели проверенный Chrome TCP/H2, однако имеют QUIC/QPACK-ограничения, у noble-tls дополнительно найден дублирующий GET. У wreq/primp совпавший JA4 скрывает пустые trust_anchors, старые пресеты других клиентов сохраняют перечисленные TLS/H2/H3-дефекты.

Места учитывают точность целевого профиля, охват браузеров, HTTP/3 и удобство сопровождения. Это рейтинг проверенных конфигураций, а не вероятность обнаружения антифродом.

Границы подтверждения результатов

Границы подтверждения и классификация iOS

Для актуального Firefox156 сохранённый сырой TCP-эталон относится к fresh. В resumed продукт добавляет 41 и удаляет 35, но полного парного захвата именно resumed Firefox156 пока нет: переход не объявляется доказанным дефектом и не выдаётся за полное сырое сравнение с эталоном. У Safari TCP подтверждены шифры, расширения, алгоритмы подписи, H2 и отсутствиеPSK, не каждое тело расширения имеет сохранённый парный браузерный эталон. У Edge принятый QUIC0-RTT наблюдался во всех четырёх qz-повторах, ранний HTTP -в двух. Принятие 0-RTT не означает, что каждый HTTP-запрос отправлен до завершения handshake, для сравнения частот нужна сопоставимая серия настоящего Edge.

Рейтинг всех 20 клиентов

Приоритет: точность Chrome154, затем Safari/Firefox/Edge/Android и HTTP/3, затем готовые профили и интеграция. ✓ - подтверждено по критерию, △ - частично или с ограничениями, ✕ - функция отсутствует или цель не достигнута. Пояснения доступны при наведении и в карточках клиентов. Зелёный Chrome относится к TCP/H2, HTTP/3 оценивается отдельно.

Результаты проверки отпечатков

№КлиентChrome154Safari26Firefox156Edge154Android154HTTP/3HTTP/2trust_anchorsClient HintsGREASEПовторный TLS
1BlankTrail Proxy✓✓✓✓✓✓✓✓✓✓✓
2httpcloak✓△✕✕△△△✓△△✓
3Go tls-client✓△✕✕△✕△✓△△△
4noble-tls✓△✕✕△✕△✓△△△
5wreq Python△△✕✕△✕✓✕✕△✓
6primp△△✕✕△✕✓✕✕✕✕
7wreq-js✕△✕✕✕✕✓✕✕△△
8curl_cffi / curl-impersonate✕✕✕✕✕✕✓✕△✕✕
9rnet✕△✕✕✕✕✓✕✕✕△
10Python tls-client✕✕✕✕✕✕✓✕△✕△
11req/v3✕✕✕✕✕✕△✕△✕✕
12uTLS + Go HTTP/2✕✕✕✕✕✕✕✓△△△
13impit✕✕✕✕✕✕✕✕△✕✕
14CycleTLS✕△✕✕✕✕△✕△✕△
15got-scraping✕✕✕✕✕✕✕✕✓✕✕
16HTTPX✕✕✕✕✕✕△✕△✕✕
17Go net/http✕✕✕✕✕✕△✕△✕△
18Windows curl✕✕✕✕✕✕✕✕△✕✕
19requests✕✕✕✕✕✕✕✕△✕✕
20Node fetch✕✕✕✕✕✕✕✕△✕△

Интеграция, профили и сопровождение

№КлиентИнтеграцияПрофилиОбновленияСтек
1BlankTrail Proxy✓✓✓✓
2httpcloak△△△△
3Go tls-client△△△△
4noble-tls✓△△△
5wreq Python✓✕△△
6primp✓✕△△
7wreq-js✓✕△△
8curl_cffi / curl-impersonate✓✕△△
9rnet✓✕△△
10Python tls-client✓✕△△
11req/v3△△△△
12uTLS + Go HTTP/2✕△✕△
13impit✓✕△△
14CycleTLS△△✕△
15got-scraping✓✕✕△
16HTTPX✓✕✕△
17Go net/http✓✕✕△
18Windows curl✓✕✕△
19requests✓✕✕△
20Node fetch✓✕✕△

Сильные стороны, ограничения и итог по каждому клиенту

Раскройте карточку для версий, выбранных профилей и подробного объяснения всех оценок. Порядок клиентов и места в рейтинге одинаковы в обеих таблицах.

1. BlankTrail Proxy 1.3.15

Сильные стороны: Готовый охват текущих целей и подключение старого/стороннего ПО через прокси без переписывания кода, проверенные H3-поля Android и QPACK Chromium соответствуют эталонам

Слабые стороны / ограничения: Отдельное приложение: требуется установка отдельного приложения, но компенсируется его кроссплатформеностью и установкой в Docker.

Итог: Первое место за готовый охват текущих целей и совместимость со сторонним ПО через прокси. Проверенные H3/QPACK-поля соответствуют эталонам, отдельная установка и обозначенные границы доказательства сохранены. HTTP/3: 72 запроса без ошибок, 36 соединений без различий в проверенных полях, ранний GET и отказ 0-RTT проверены.

✓ Chrome154
H2: поля 154
✓ Safari26 mac/iOS
TCP Safari26 и database/UA CriOS/FxiOS/EdgiOS: WebKit H2,24 iOS-соединения безPSK
✓ Firefox156
Свежие TCP/H2 Firefox156 и проверенные H3-поля совпали, полный парный сырой resumed TCP-эталон 156 отсутствует
✓ Edge154
TCP/H2 Edge154, проверенные H3-поля, включая encoder stream10 Chromium, совпали
✓ Chrome Android154
Новый физический Android154: проверенные TLS/TP/SETTINGS/Initial и QPACK stream10 совпали, PSK и ранний qz-запрос подтверждены
✓ HTTP/3
342 QUIC-соединения шести профилей без различий перечисленных постоянных полей,300 свежих для GREASE/QPACK,42 для fresh/resumed, не универсальное равенство всех байтов
✓ HTTP/2
Целевые профили
✓ trust_anchors
Chrome: набор ID
✓ Client Hints
Desktop Client Hints согласованы, iOS WebKit без desktop CH. Требование CH к CriOS/EdgiOS в текущем /client - ошибка классификации детектора
✓ GREASE / перемешивание
Структура, вариативность и перемешивание подтверждены серией, статистическая универсальная эквивалентность не заявляется
✓ Возобновление
Safari TCP без PSK, H3 PSK и ранний HTTP подтверждены у всех шести профилей. Edge: QUIC0-RTT4/4, ранний HTTP2/4, полный resumed TCP-эталон Firefox156 отсутствует
✓ Интеграция
Подключение через HTTP/SOCKS-прокси без встраивания библиотеки в исходный код программы. Для соответствующего HTTPS-режима нужно настроить доверие CA.
✓ Нужные профили
Готовые 154/156/26
✓ Актуализация
База продукта, не позднее 5 дней релиза
✓ Код / стек
Работает через прокси с разными стеками, старым и сторонним ПО без доступа к исходникам. Совместимость зависит от поддержки нужного прокси-режима и доверия CA.
2. httpcloak1.7.2

Сильные стороны: Лучший подтверждённый Chrome QUIC среди библиотек в этих тестах

Слабые стороны / ограничения: Нет точного набора всех текущих целей, custom сопровождение H3: auto остался на TCP, после простоя q/qd и при отказе 0-RTT - ошибки, retry=2 не помог.

Итог: Выше Go/noble по Chrome H3, ниже BlankTrail по готовому охвату

✓ Chrome154
custom154/H2
△ Safari26 mac/iOS
iOS: TLS-сводка, H2 иной, mac пресета нет
✕ Firefox156
Latest не 156, H3 отличается
✕ Edge154
Chrome с Edge UA: лишнее 51764
△ Chrome Android154
H2 latest после CH154
△ HTTP/3
Chrome: проверенные поля совпали, FF/Safari отличаются
△ HTTP/2
Chrome да, Safari нет
✓ trust_anchors
Chrome: набор ID
△ Client Hints
В custom согласованы, другие цели вручную
△ GREASE / перемешивание
Chrome: наблюдено, не все цели
✓ Возобновление
Chrome PSK принят, Safari повтор безPSK
△ Интеграция
JSON-конфиг и API
△ Нужные профили
154 вручную, latest152
△ Актуализация
Пресеты обновляет проект, custom поддерживать самому
△ Код / стек
Несколько SDK, требуется интеграция
3. Go tls-client1.16.0

Сильные стороны: Конструкторы TLS/H2, точный проверенный ChromeH2

Слабые стороны / ограничения: Mac Safari16, актуальные Edge/Firefox, QUIC/SETTINGS, QPACK Huffman для ?0 H3: возобновление уже на втором запросе, ранний GET не отправлен, отказ 0-RTT обработан.

Итог: Сильный H2-конструктор, H3 уменьшает общий результат

✓ Chrome154
152_PSK: H2-поля 154
△ Safari26 mac/iOS
iOS26 freshH2, mac16 устарел
✕ Firefox156
148 не 156
✕ Edge154
Chrome-профиль неEdge154
△ Chrome Android154
152_PSK/H2 с AndroidCH154
✕ HTTP/3
QUIC TLS/CID,152_PSK SETTINGS только 51, QPACK ?0 кодируется иначе
△ HTTP/2
Chrome/iOS да, mac16 нет
✓ trust_anchors
Chrome H2: набор ID
△ Client Hints
Задаёт вызывающий код
△ GREASE / перемешивание
Chrome TCP да, QUIC иной
△ Возобновление
Chrome да, iOS26 безPSK, mac16 устарел
△ Интеграция
Go API, требуется код
△ Нужные профили
154 нет, профиль/заголовки вручную
△ Актуализация
Релизы ядра + сопровождение custom
△ Код / стек
Go, другие языки через обёртки
4. noble-tls0.1.9 / native1.16.0

Сильные стороны: Удобный async и ядро Go tls-client

Слабые стороны / ограничения: H3 отличия, раздельные версии обёртки/ядра H3: первый GET продублирован по H2/H3 в protocol racing, раннего GET нет, отказ 0-RTT обработан.

Итог: Уступает прямому Go API по сопровождению

✓ Chrome154
152_PSK: H2-поля 154
△ Safari26 mac/iOS
iOS26/H2, mac16 иной
✕ Firefox156
148 не 156
✕ Edge154
Chrome-профиль неEdge154
△ Chrome Android154
152_PSK/H2 с CH154
✕ HTTP/3
QUIC отличается, raw QPACK обёртки отдельно не снят
△ HTTP/2
Chrome/iOS да
✓ trust_anchors
Chrome H2: набор ID
△ Client Hints
Задаёт Python-код
△ GREASE / перемешивание
TCP да, QUIC иной
△ Возобновление
Chrome да, iOS26 безPSK, mac16 устарел
✓ Интеграция
Python async API
△ Нужные профили
Новые имена через native, enum отстаёт
△ Актуализация
Обновлять пакет и native отдельно
△ Код / стек
Python + native бинарники
5. wreq Python0.12.3

Сильные стороны: Хорошие H2-пресеты Safari, выбор платформы

Слабые стороны / ограничения: Пустые trust anchors, старые CH, H3 не заработал

Итог: Выше primp по проверенным Chrome TLS-полям

△ Chrome154
153: JA4/H2 да, raw дефекты
△ Safari26 mac/iOS
26 mac/iOS сводкиH2
✕ Firefox156
151 не 156
✕ Edge154
148 не 154
△ Chrome Android154
153: H2-сводки
✕ HTTP/3
HTTP_3: NO_APPLICATION_PROTOCOL
✓ HTTP/2
Chrome/Safari сводки
✕ trust_anchors
Пустой 51764
✕ Client Hints
153 при UA154
△ GREASE / перемешивание
sigGREASE/перемешивание, неполный raw всех целей
✓ Возобновление
Chrome PSK, Safari26 повтор безPSK
✓ Интеграция
Python sync/async
✕ Нужные профили
Готового 154 нет
△ Актуализация
Релизы wreq, обновлять зависимость
△ Код / стек
Python/Rust, отдельный Node пакет
6. primp2.0.1 (Python)

Сильные стороны: Простой API, широкие пресеты

Слабые стороны / ограничения: trust anchors/ALPS/GREASE, SafariPSK отличается, ошибки закрытияH2

Итог: Удобство не компенсирует сырые отличия

△ Chrome154
153: сводки, raw отличия
△ Safari26 mac/iOS
26: сводки, raw отличия
✕ Firefox156
151 не 156
✕ Edge154
151: raw sig/ALPS отличаются
△ Chrome Android154
153: сводкиH2
✕ HTTP/3
Проверенный Python-пакет 2.0.1 собран без feature http3 и не предоставляет QUIC/H3 API. У Rust-ядра есть отдельная необязательная feature http3, это другой вариант сборки, его результат не переносится на Python-пакет.
✓ HTTP/2
Полученные сводки
✕ trust_anchors
Пустой 51764
✕ Client Hints
153 при UA154
✕ GREASE / перемешивание
Нет GREASE в sigalgs Chrome
✕ Возобновление
Safari26: PSK1 принят, 2/4 ответа потеряны
✓ Интеграция
Python sync/async
✕ Нужные профили
154 нет
△ Актуализация
Релизы пакета, custom ограничен
△ Код / стек
Python/Rust транспорт
7. wreq-js3.2.0

Сильные стороны: Safari H2 и привычный fetch

Слабые стороны / ограничения: Старые Chrome/Edge, не получен точный 154

Итог: Ниже свежих Python-пресетов

✕ Chrome154
149: TLS иной
△ Safari26 mac/iOS
26 mac/iOS сводкиH2
✕ Firefox156
151 не 156
✕ Edge154
148 не 154
✕ Chrome Android154
149: TLS иной
✕ HTTP/3
У wreq-js3.2.0 и используемого wreq0.16.1 нет штатного QUIC/H3-транспорта. ALPN HTTP3 в типах TLS-конфигурации не создаёт транспорт QUIC, auto-запросы шли по TCP/H2.
✓ HTTP/2
Chrome/Safari сводки
✕ trust_anchors
Нужного payload нет
✕ Client Hints
Старый пресет, руками
△ GREASE / перемешивание
Есть overrides, текущий 154 не получен
△ Возобновление
Safari26 безPSK, точный Chrome154 не получен
✓ Интеграция
Fetch API Node/Bun
✕ Нужные профили
154 отвергается
△ Актуализация
Релизы npm/ядра
△ Код / стек
Node/Bun, интеграция кода
8. curl_cffi0.16.3 / curl-impersonate

Сильные стороны: Широкий API, работающий H3, низкая цена интеграции

Слабые стороны / ограничения: Несовпадения текущих целей на TLS/QUIC В H3 PSK после простоя работает, но ранние данные в проверенном профиле не предложены.

Итог: H3 и гибкость полезны, точный 154 не получен

✕ Chrome154
150: нет 51764/sigGREASE
✕ Safari26 mac/iOS
Safari260: raw/QUIC отличия
✕ Firefox156
147: не 156, старый resumed дефект
✕ Edge154
Edge101 устарел
✕ Chrome Android154
Android131 устарел
✕ HTTP/3
Chrome SETTINGS совпали, TLS/Initial154 и Safari raw отличаются
✓ HTTP/2
Chrome H2 совпал
✕ trust_anchors
Нет 51764
△ Client Hints
Ручные headers / пресеты
✕ GREASE / перемешивание
Нет sigGREASE цели 154
✕ Возобновление
Safari: 3PSK приняты, Firefox resumed сохраняет 35
✓ Интеграция
Requests API sync/async
✕ Нужные профили
154 нет, custom попытка не совпала
△ Актуализация
Релизы библиотеки, custom самому
△ Код / стек
Python/libcurl/CLI экосистема
9. rnet2.4.2

Сильные стороны: Готовые пресеты и sync/async

Слабые стороны / ограничения: Старый каталог, H3 API отказал

Итог: Доступность профиля ограничивает результат

✕ Chrome154
137 устарел
△ Safari26 mac/iOS
18.5: сводка 26, сырые отличия
✕ Firefox156
139 не 156
✕ Edge154
134 не 154
✕ Chrome Android154
137 с AndroidUA иной
✕ HTTP/3
HTTP_3: UnsupportedVersion
✓ HTTP/2
Chrome/Safari сводки
✕ trust_anchors
Нет 51764
✕ Client Hints
Старые presets CH
✕ GREASE / перемешивание
Старые sigalgs/ALPS
△ Возобновление
Safari повтор безPSK, полный актуальный профиль не подтверждён
✓ Интеграция
Python sync/async
✕ Нужные профили
154 нет
△ Актуализация
Обновления пакета
△ Код / стек
Python/Rust
10. Python tls-client1.0.1

Сильные стороны: Низкий порог подключения

Слабые стороны / ограничения: Значительное отставание ядра и каталога

Итог: Удобный API со старым транспортом

✕ Chrome154
120 устарел
✕ Safari26 mac/iOS
Safari15.6 устарел
✕ Firefox156
Четыре запроса с firefox_120 и UA Firefox156. Сырые группы:29,23,24,25,256,257, у эталона 156 есть 4588 и другой набор. Готового 156 в каталоге 1.0.1 нет.
✕ Edge154
Готового Edge154 в каталоге 1.0.1 нет. Проверен Chromium chrome_120 с UA Edge154: группы без 4588, старый ALPS17513, нет GREASE эталона в signature_algorithms.
✕ Chrome Android154
120 с AndroidUA иной
✕ HTTP/3
В установленной Python-обёртке 1.0.1 и её поставляемом native-транспорте нет штатного HTTP/3 API, QUIC-соединения не получены.
✓ HTTP/2
Chrome H2 сводка
✕ trust_anchors
Нет 51764
△ Client Hints
Headers вручную
✕ GREASE / перемешивание
Старые группы/ALPS
△ Возобновление
Safari15.6 безPSK, но свежий TLS устарел
✓ Интеграция
Python requests-подобный
✕ Нужные профили
154 имя не даёт корректный профиль
△ Актуализация
Native и пакет требуют обновления
△ Код / стек
Python/native
Подробности проверенной штатной настройки

Python tls-client1.0.1: firefox_120 с UA156 сохранил старые группы без 4588, Chromium-профиль с UA Edge154 сохранил старый ALPS и алгоритмы подписи. Готовых целевых версий нет. req/v3: ImpersonateSafari и ImpersonateFirefox используют старые профили Safari16/Firefox120, Chrome-пресет -120. uTLS1.8.2: Auto выбирает Chrome133, Firefox120, Safari16 и Edge85. Их новые TCP-соединения не совпали с текущими целями. Собственный ClientHelloSpec позволяет строить другую конфигурацию, но не превращает эти готовые профили в актуальные. Версии и пресеты можно проверить в API req/v3 и API uTLS1.8.2.

Подробности проверенной штатной настройки

HTTP/3 оценивается для конкретной поставки. У проверенного primp2.0.1 Python нет QUIC: его сборка Python не включает необязательную http3-feature Rust-ядра. У wreq-js3.2.0, Python tls-client1.0.1, got-scraping4.2.1 и обычных контрольных транспортов HTTP/3 отсутствует. Связка uTLS + Go HTTP/2 также не содержит QUIC, добавление отдельного QUIC-клиента означало бы проверку другого решения.

11. req/v3 3.61.0

Сильные стороны: Гибкий TLS/H2 API и реальный H3

Слабые стороны / ограничения: Штатный Chrome не текущая цель В H3 соединение пережило простой, после закрытия сервером новый handshake без PSK/0-RTT.

Итог: Выше низкоуровневого uTLS по готовому HTTP3 API

✕ Chrome154
ImpersonateChrome иной
✕ Safari26 mac/iOS
Проверены четыре новых TCP-соединения: Safari16 с UA целевой версии. Готового актуального профиля нет, постоянные TLS-поля отличаются от эталона. Для uTLS HTTP/2 остаётся отдельным транспортом. Результат относится к этим готовым профилям, возможность построить собственный ClientHelloSpec не отрицается.
✕ Firefox156
Проверены четыре новых TCP-соединения: Firefox120 с UA целевой версии. Готового актуального профиля нет, постоянные TLS-поля отличаются от эталона. Для uTLS HTTP/2 остаётся отдельным транспортом. Результат относится к этим готовым профилям, возможность построить собственный ClientHelloSpec не отрицается.
✕ Edge154
Проверены четыре новых TCP-соединения: Chrome120 с UA целевой версии. Готового актуального профиля нет, постоянные TLS-поля отличаются от эталона. Для uTLS HTTP/2 остаётся отдельным транспортом. Результат относится к этим готовым профилям, возможность построить собственный ClientHelloSpec не отрицается.
✕ Chrome Android154
Проверены четыре новых TCP-соединения: Chrome120 с UA целевой версии. Готового актуального профиля нет, постоянные TLS-поля отличаются от эталона. Для uTLS HTTP/2 остаётся отдельным транспортом. Результат относится к этим готовым профилям, возможность построить собственный ClientHelloSpec не отрицается.
✕ HTTP/3
H3 работает, raw/SETTINGS иные
△ HTTP/2
Настройка возможна, цель не совпала
✕ trust_anchors
Нет нужного 51764
△ Client Hints
Ручные headers
✕ GREASE / перемешивание
Проверенный 154 не воспроизведён
✕ Возобновление
Четыре новые TCP-сессии для каждого ImpersonateChrome/Safari/Firefox: pre_shared_key не появился. Переходы Chromium/Firefox к возобновлённому отпечатку не воспроизведены, старый Safari-профиль не подтверждает актуальный Safari целиком.
△ Интеграция
Go API / low-level опции
△ Нужные профили
Собирать нужный профиль
△ Актуализация
База частичная, custom самому
△ Код / стек
Go
12. uTLS + Go HTTP2

Сильные стороны: Максимальная свобода ClientHelloSpec

Слабые стороны / ограничения: TLS сам по себе не исправляет HTTP2/3

Итог: Инструмент для построения клиента, а не готовая цель

✕ Chrome154
Готовый пресет не 154
✕ Safari26 mac/iOS
Проверены четыре новых TCP-соединения: Safari16 с UA целевой версии. Готового актуального профиля нет, постоянные TLS-поля отличаются от эталона. Для uTLS HTTP/2 остаётся отдельным транспортом. Результат относится к этим готовым профилям, возможность построить собственный ClientHelloSpec не отрицается.
✕ Firefox156
Проверены четыре новых TCP-соединения: Firefox120 с UA целевой версии. Готового актуального профиля нет, постоянные TLS-поля отличаются от эталона. Для uTLS HTTP/2 остаётся отдельным транспортом. Результат относится к этим готовым профилям, возможность построить собственный ClientHelloSpec не отрицается.
✕ Edge154
Проверены четыре новых TCP-соединения: Edge85 с UA целевой версии. Готового актуального профиля нет, постоянные TLS-поля отличаются от эталона. Для uTLS HTTP/2 остаётся отдельным транспортом. Результат относится к этим готовым профилям, возможность построить собственный ClientHelloSpec не отрицается.
✕ Chrome Android154
Проверены четыре новых TCP-соединения: Chrome133 с UA целевой версии. Готового актуального профиля нет, постоянные TLS-поля отличаются от эталона. Для uTLS HTTP/2 остаётся отдельным транспортом. Результат относится к этим готовым профилям, возможность построить собственный ClientHelloSpec не отрицается.
✕ HTTP/3
В проверяемой связке uTLS + golang.org/x/net/http2 отсутствует транспорт QUIC/HTTP3. Подключение иной QUIC-библиотеки означало бы уже другую связку.
✕ HTTP/2
Стандартный GoH2 иной
✓ trust_anchors
Штатный GenericExtension в ClientHelloSpec передал эталонный payload trust_anchors51764. Четыре успешных запроса, захваченные байты расширения совпали с эталоном. Нужна ручная сборка Spec, это не готовый актуальный браузерный профиль. Для Spec без PSK использован PreferSkipResumptionOnNilExtension=true.
△ Client Hints
Вручную
△ GREASE / перемешивание
Spec гибкий, нужно настроить
△ Возобновление
Cache/Spec на стороне разработчика
✕ Интеграция
Низкоуровневая интеграция
△ Нужные профили
Собирать TLS и H2 отдельно
✕ Актуализация
Custom поддерживать самому
△ Код / стек
Go, собственный транспорт
Подробности проверенной штатной настройки

Низкоуровневые возможности учитываются отдельно: у uTLS штатный GenericExtension в ClientHelloSpec передал эталонное trust_anchors51764. Четыре успешных запроса и сырые ClientHello подтвердили совпадение байтов этого расширения - в соответствующей колонке зелёная отметка. Ручная сборка Spec и отдельный H2-транспорт по-прежнему необходимы, совпадение одного расширения не делает готовый Chrome133 актуальным Chrome154.

13. impit0.14.5

Сильные стороны: Простой API и работающий H3

Слабые стороны / ограничения: Нет точного текущего Chrome/Safari, H2/QUIC дефекты В H3 PSK после простоя работает, но раннего HTTP-запроса нет.

Итог: Наличие H3 не подняло точность имитации

✕ Chrome154
151: TLS/H2 другие
✕ Safari26 mac/iOS
Safari нет в проверенном enum
✕ Firefox156
144 не 156
✕ Edge154
Chrome с EdgeUA неEdge
✕ Chrome Android154
Android: TLS/H2 другие
✕ HTTP/3
H3 работает, raw сильно иной
✕ HTTP/2
Иные SETTINGS/окно
✕ trust_anchors
Нет нужного 51764
△ Client Hints
Headers нужно согласовать
✕ GREASE / перемешивание
QUIC сохраняет TCP-подобный набор
✕ Возобновление
Повторный TLS отличается
✓ Интеграция
Fetch Python/Node
✕ Нужные профили
154 отвергается
△ Актуализация
Релизы проекта
△ Код / стек
Python/Node/native
14. CycleTLS2.0.5

Сильные стороны: Штатные JA3/JA4R/H2-параметры, работающий H3, вручную совпавшая H2-сводка Firefox

Слабые стороны / ограничения: Chrome154 JA3 отвергает extension51764, JA4R меняет группы, JA3/совместная настройка TLS1.2, Safari узнаётся коротким детектором, но расходится в сырых полях В принудительном H3 - отдельное fresh-соединение на каждый GET, без PSK/0-RTT.

Итог: Гибкий конструктор, однако проверенные настройки не воспроизвели полные текущие цели, ограниченное Safari/H2-прохождение отражено жёлтым

✕ Chrome154
JA3/H2 custom154: handshake ошибка
△ Safari26 mac/iOS
Штатный ручной JA4R дал четыре успешных TLS1.3 запроса, и короткий детектор узнал Safari26. Сырые supported_groups оказались 29,29,23,24 вместо набора с 4588, точное совпадение Safari не получено. JA3 и совместный JA3+JA4R выбрали TLS1.2.
✕ Firefox156
Проверены JA3, JA4R и их совместная передача с эталонным HTTP2Fingerprint Firefox156. JA3/совместный режим дали TLS1.2 вместо TLS1.3, JA4R изменил группы и завершился ошибкой рукопожатия. Полный отпечаток 156 не получен.
✕ Edge154
Проверены JA3/JA4R и совместная конфигурация Edge154. JA3/совместная конфигурация дала TLS1.2 и чужие signature_algorithms, JA4R - ошибку рукопожатия. H2 также содержит лишние/другие SETTINGS.
✕ Chrome Android154
Проверенная ручная Chrome154-конфигурация, применённая к Android-цели, отвергла extension51764 (trust_anchors). Отдельный JA4R также не дал успешного рукопожатия. Цель не достигнута в проверенных настройках.
✕ HTTP/3
H3 работает, JA3 не дала нужный QUIC
△ HTTP/2
С вручную переданным HTTP2Fingerprint Firefox совпала сводка H2:1:65536,4:131072,5:16384|12517377|0|m,p,a,s. Chrome/Edge/Safari-конфигурации воспроизвели SETTINGS не полностью, полного H2-прохождения всех целей нет.
✕ trust_anchors
Ошибка расширения 51764 в H2
△ Client Hints
Заголовки руками
✕ GREASE / перемешивание
QUIC другой набор/группы
△ Возобновление
В успешном Safari JA4R-прогоне четыре свежих TLS1.3 Hello без PSK согласуются с отсутствием TCP-возобновления Safari, но сырые поля не совпали. Chromium/Firefox PSK-переход с актуальным отпечатком не получен.
△ Интеграция
Node + native / явные параметры
△ Нужные профили
JA3/JA4/H2 конфиг, не готовый 154
✕ Актуализация
Custom самому
△ Код / стек
Node/native, нужна интеграция
Подробности проверенной штатной настройки

CycleTLS2.0.5: проверены три штатные настройки: JA3 с эталонной H2-сводкой, JA4R с алгоритмами подписи и совместная передача JA3+JA4R. Chrome154-конфигурация JA3 возвращает отказ на extension51764. JA4R сам по себе задаёт иной набор групп, Chrome/Edge/Firefox-рукопожатия не завершились. Safari JA4R дал четыре успешных TLS1.3 запроса и узнавание Safari26 коротким детектором, но сырые группы 29,29,23,24 отличаются от эталона с 4588. JA3 и совместная настройка в этих прогонах выбрали TLS1.2. При этом вручную переданная H2-сводка Firefox совпала - поэтому этот результат учтён как частичный. Настройки доступны в штатном API CycleTLS, несовпадение короткой сводки и полного отпечатка здесь особенно наглядно.

15. got-scraping4.2.1

Сильные стороны: Удобный генератор заголовков

Слабые стороны / ограничения: EOL и небраузерный транспорт

Итог: Headers не компенсируют TLS/H2

✕ Chrome154
Headers154, TLS/H2 иные
✕ Safari26 mac/iOS
Четыре запроса с заголовками Safari 26.6.2. Генератор меняет заголовки и часть TLS-опций, но сырые TLS-поля и H2 не совпадают с браузером. Во всех случаях H2-сводка 2:0,4:33554432|4128769|0|m,p,a,s.
✕ Firefox156
Четыре запроса с заголовками Firefox156. Генератор меняет заголовки и часть TLS-опций, но сырые TLS-поля и H2 не совпадают с браузером. Во всех случаях H2-сводка 2:0,4:33554432|4128769|0|m,p,a,s.
✕ Edge154
Четыре запроса с заголовками Edge154. Генератор меняет заголовки и часть TLS-опций, но сырые TLS-поля и H2 не совпадают с браузером. Во всех случаях H2-сводка 2:0,4:33554432|4128769|0|m,p,a,s.
✕ Chrome Android154
Четыре запроса с заголовками Chrome Android154. Генератор меняет заголовки и часть TLS-опций, но сырые TLS-поля и H2 не совпадают с браузером. Во всех случаях H2-сводка 2:0,4:33554432|4128769|0|m,p,a,s.
✕ HTTP/3
В got-scraping4.2.1 транспорт основан на Node TLS и http2-wrapper, QUIC/HTTP3 API отсутствует. Auto-прогон использовал TCP/H2.
✕ HTTP/2
НеChrome
✕ trust_anchors
Нет нужного 51764
✓ Client Hints
Генератор headers154
✕ GREASE / перемешивание
Транспорт неChrome
✕ Возобновление
В повторных TCP-замерах pre_shared_key не появился, переключение заголовков браузера не воспроизвело свежий/resumed отпечаток Chromium или Firefox. Результат относится к проверенной конфигурации got-scraping.
✓ Интеграция
Got/Node API
✕ Нужные профили
Транспортного 154 нет
✕ Актуализация
EOL, нет актуального сопровождения
△ Код / стек
Node
16. HTTPX0.28.1

Сильные стороны: Надёжный привычный HTTP API

Слабые стороны / ограничения: Смена UA не заменяет TLS/H2/QUIC

Итог: Контрольный клиент, не impersonation-решение

✕ Chrome154
Контроль: неChrome
✕ Safari26 mac/iOS
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Firefox156
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Edge154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Chrome Android154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ HTTP/3
В проверенном штатном транспорте HTTP/3 отсутствует, браузерный QUIC-отпечаток этим клиентом не получен.
△ HTTP/2
HTTP2 включён, иной
✕ trust_anchors
В захваченных ClientHello нет расширения trust_anchors с набором идентификаторов эталона Chrome154.
△ Client Hints
Можно задать вручную
✕ GREASE / перемешивание
В захваченных ClientHello отсутствует браузерный GREASE и соответствующее Chromium перемешивание расширений.
✕ Возобновление
После повторного соединения в проверенной конфигурации PSK-переход Chrome/Firefox не получен. Для curl проверены четыре запроса в одном процессе, для Python - сохранённый клиент. Это результат данной конфигурации, а не утверждение об отсутствии любых TLS-сессий в TLS-бэкенде.
✓ Интеграция
Python sync/async
✕ Нужные профили
Штатной базы браузерных TLS/H2/QUIC-профилей нет, заголовок User-Agent профилем не является.
✕ Актуализация
Браузерная база отпечатков отсутствует. Обновление HTTP-клиента не предоставляет такую базу.
△ Код / стек
Python
17. Go net/http

Сильные стороны: Надёжный привычный HTTP API

Слабые стороны / ограничения: Смена UA не заменяет TLS/H2/QUIC

Итог: Контрольный клиент, не impersonation-решение

✕ Chrome154
Контроль: неChrome
✕ Safari26 mac/iOS
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Firefox156
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Edge154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Chrome Android154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ HTTP/3
В проверенном штатном транспорте HTTP/3 отсутствует, браузерный QUIC-отпечаток этим клиентом не получен.
△ HTTP/2
HTTP2 есть, иной
✕ trust_anchors
В захваченных ClientHello нет расширения trust_anchors с набором идентификаторов эталона Chrome154.
△ Client Hints
Можно задать вручную
✕ GREASE / перемешивание
В захваченных ClientHello отсутствует браузерный GREASE и соответствующее Chromium перемешивание расширений.
△ Возобновление
Принятое сервером TLS1.3 PSK-возобновление подтверждено. При повторе сохраняется нативный отпечаток Go/Node, эмуляция переходов целевых браузеров отсутствует.
✓ Интеграция
Стандартный Go API
✕ Нужные профили
Штатной базы браузерных TLS/H2/QUIC-профилей нет, заголовок User-Agent профилем не является.
✕ Актуализация
Браузерная база отпечатков отсутствует. Обновление HTTP-клиента не предоставляет такую базу.
△ Код / стек
Go
Подробности проверенной штатной настройки

Повторный TLS: Go net/http с включённым ClientSessionCache и встроенный Node fetch получили принятый сервером PSK, но сохранили собственные небраузерные ClientHello. Это частичная транспортная возможность, а не подтверждённая эмуляция resumed-браузера. Для HTTPX, requests, Windows curl и готовых req/v3-профилей требуемый Chromium/Firefox PSK-переход в проверенных настройках не получен. Оценка описывает воспроизводимый результат этих конфигураций, она не утверждает, что их TLS-бэкенд принципиально не умеет хранить сессии. Для Safari отсутствие TCP-PSK сравнивается с Safari-эталоном и не штрафуется само по себе.

18. Windows curl / Schannel

Сильные стороны: Надёжный привычный HTTP API

Слабые стороны / ограничения: Смена UA не заменяет TLS/H2/QUIC

Итог: Контрольный клиент, не impersonation-решение

✕ Chrome154
Контроль: неChrome
✕ Safari26 mac/iOS
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Firefox156
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Edge154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Chrome Android154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ HTTP/3
В проверенном штатном транспорте HTTP/3 отсутствует, браузерный QUIC-отпечаток этим клиентом не получен.
✕ HTTP/2
H2 зависит от сборки, измеренный транспорт иной
✕ trust_anchors
В захваченных ClientHello нет расширения trust_anchors с набором идентификаторов эталона Chrome154.
△ Client Hints
Можно задать вручную
✕ GREASE / перемешивание
В захваченных ClientHello отсутствует браузерный GREASE и соответствующее Chromium перемешивание расширений.
✕ Возобновление
После повторного соединения в проверенной конфигурации PSK-переход Chrome/Firefox не получен. Для curl проверены четыре запроса в одном процессе, для Python - сохранённый клиент. Это результат данной конфигурации, а не утверждение об отсутствии любых TLS-сессий в TLS-бэкенде.
✓ Интеграция
CLI/прокси
✕ Нужные профили
Штатной базы браузерных TLS/H2/QUIC-профилей нет, заголовок User-Agent профилем не является.
✕ Актуализация
Браузерная база отпечатков отсутствует. Обновление HTTP-клиента не предоставляет такую базу.
△ Код / стек
CLI в разных стеках
19. requests2.32.5

Сильные стороны: Надёжный привычный HTTP API

Слабые стороны / ограничения: Смена UA не заменяет TLS/H2/QUIC

Итог: Контрольный клиент, не impersonation-решение

✕ Chrome154
Контроль: неChrome
✕ Safari26 mac/iOS
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Firefox156
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Edge154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Chrome Android154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ HTTP/3
В проверенном штатном транспорте HTTP/3 отсутствует, браузерный QUIC-отпечаток этим клиентом не получен.
✕ HTTP/2
H1, H2 нет в этом транспорте
✕ trust_anchors
В захваченных ClientHello нет расширения trust_anchors с набором идентификаторов эталона Chrome154.
△ Client Hints
Можно задать вручную
✕ GREASE / перемешивание
В захваченных ClientHello отсутствует браузерный GREASE и соответствующее Chromium перемешивание расширений.
✕ Возобновление
После повторного соединения в проверенной конфигурации PSK-переход Chrome/Firefox не получен. Для curl проверены четыре запроса в одном процессе, для Python - сохранённый клиент. Это результат данной конфигурации, а не утверждение об отсутствии любых TLS-сессий в TLS-бэкенде.
✓ Интеграция
Python sync
✕ Нужные профили
Штатной базы браузерных TLS/H2/QUIC-профилей нет, заголовок User-Agent профилем не является.
✕ Актуализация
Браузерная база отпечатков отсутствует. Обновление HTTP-клиента не предоставляет такую базу.
△ Код / стек
Python
20. Node fetch

Сильные стороны: Надёжный привычный HTTP API

Слабые стороны / ограничения: Смена UA не заменяет TLS/H2/QUIC

Итог: Контрольный клиент, не impersonation-решение

✕ Chrome154
Контроль: неChrome
✕ Safari26 mac/iOS
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Firefox156
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Edge154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ Chrome Android154
Браузерных профилей нет. Запросы с UA этой цели сохранили нативный TLS-отпечаток, смена UA не воспроизводит браузер.
✕ HTTP/3
В проверенном штатном транспорте HTTP/3 отсутствует, браузерный QUIC-отпечаток этим клиентом не получен.
✕ HTTP/2
Измеренный H1
✕ trust_anchors
В захваченных ClientHello нет расширения trust_anchors с набором идентификаторов эталона Chrome154.
△ Client Hints
Можно задать вручную
✕ GREASE / перемешивание
В захваченных ClientHello отсутствует браузерный GREASE и соответствующее Chromium перемешивание расширений.
△ Возобновление
Принятое сервером TLS1.3 PSK-возобновление подтверждено. При повторе сохраняется нативный отпечаток Go/Node, эмуляция переходов целевых браузеров отсутствует.
✓ Интеграция
Встроенный fetch
✕ Нужные профили
Штатной базы браузерных TLS/H2/QUIC-профилей нет, заголовок User-Agent профилем не является.
✕ Актуализация
Браузерная база отпечатков отсутствует. Обновление HTTP-клиента не предоставляет такую базу.
△ Код / стек
Node

Браузерный отпечаток складывается из TLS, HTTP2/3, заголовков и поведения следующего соединения. Выбирать решение стоит по проверенной цели и цене её сопровождения: название браузера в пресете и замена User-Agent этих измерений не заменяют.

Вся библиотека браузерных профилей доступна на бесплатном тарифе Lite в BlankTrail Proxy. Можно скачать приложение и самостоятельно протестировать нужные профили.

Читайте также

DNS-утечки: что видит антифрод, при чём здесь WebRTC и как помогает BlankTrail Proxy

2 октября 2026, 20:55

Почему BlankTrail использует собственную базу абонентских DNS провайдеров, чем она отличается от открытых списков и как vDNS, DoH и TUN защищают DNS и WebRTC. Примеры аудита и инструкция проверки.

Утечки DNS и сетевых отпечатков в ZennoPoster: как обнаружить и устранить

30 сентября 2026, 18:11

В ZennoPoster DNS может раскрыть подсеть клиента через ECS, а HTTP-клиент — выдать собственный сетевой отпечаток. Разбираем реальные тесты и показываем, как настроить BlankTrail.