В 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-отпечаток складывается из того, как клиент строит 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 мажорные версии усложняет прохождение антибот проверки.

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

Подробности проверки TLS и HTTP/2 по каждому профилю
| Клиент / выбранный профиль | Свежий JA4 | HTTP/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 | Что совпало / найденные отличия |
|---|---|---|---|---|
| BlankTrail | Chrome_154_win | ✓ | ✓ | TLS: Проверенные TLS-поля, GREASE, ALPS и trust_anchors совпали. Повтор: PSK принят, переход JA4 совпал с эталоном. |
| Go tls-client | 152 и 152_PSK | ✓ | △ | TLS: 8 ClientHello: проверенные поля, ALPS и 28 anchors совпали. Повтор: 152: 0/4, 152_PSK: 3/4. Сервер выбрал PSK, расширение 41 - последнее. |
| noble-tls | native1.16.0, 152 и 152_PSK | ✓ | △ | TLS: 8 ClientHello: проверенные поля и anchors совпали. Повтор: 152: 0/4, 152_PSK: 3/4. Принятие PSK подтверждено ServerHello. |
| httpcloak | latest | ✓ | ✓ | TLS: Проверенные поля и непустой набор anchors совпали. Повтор: PSK работает в проверенной конфигурации. |
| wreq Python | Chrome153 | △ | ✓ | TLS: JA4 совпал, но trust_anchors - пустой список 0000. Алгоритмы подписи и ALPS совпали. Повтор: PSK работает, пустой TLS-payload остаётся отличием. |
| primp | chrome_153 | ✕ | ✕ | TLS: Пустые trust_anchors, нет GREASE в signature_algorithms, другое тело ALPS. Повтор: Нужный PSK-переход не получен. |
| curl_cffi | chrome150 | ✕ | ✕ | TLS: Нет trust_anchors и GREASE эталона154 в алгоритмах подписи. Повтор: Нужный TCP-переход не воспроизведён. |
| Python tls-client | chrome_120 | ✕ | △ | TLS: Старые группы и код ALPS, нет trust_anchors. Имя chrome_154 не создаёт новый профиль. Повтор: Частично, старый TLS-профиль сохраняет отличия. |
| rnet | Chrome137 | ✕ | △ | TLS: Старые signature_algorithms, нет trust_anchors. Повтор: В исходной серии - 0/4, итоговая оценка частичная. |
| wreq-js | chrome_149 | ✕ | △ | TLS: Старый профиль, overrides не задают payload anchors. Повтор: Частично, точная целевая цепочка не подтверждена. |
| req/v3 | ImpersonateChrome | ✕ | ✕ | TLS: Штатный TLS-профиль120 не соответствует154. Повтор: Нужный Chromium PSK-переход не получен. |
| uTLS + Go HTTP/2 | Собственный транспорт | ✕ | △ | TLS: HelloChrome_Auto использует профиль133, кастомизация anchors возможна, готовый154 не получен. Повтор: Частично, нужна отдельная настройка. |
| impit | chrome151 | ✕ | ✕ | TLS: TLS-профиль151 и повторное рукопожатие отличаются. Повтор: Повторный отпечаток отличается. |
| CycleTLS | JA3 + 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 изменило результат. Возможность и настройка конкретного режима должны оцениваться отдельно.

На 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 | Что важно в эталоне |
|---|---|---|
| Chrome154 | q13d0312h3_55b375c5d22e_178839b6cec1 | Есть trust_anchors, Initial1250 байт, DCID8 / SCID0. |
| Edge154 | q13d0311h3_55b375c5d22e_653d80c3fe9d | trust_anchors отсутствует, Initial1250, DCID8 / SCID0. Chrome с заменёнными заголовками не становится Edge. |
| Firefox156 | q13d0315h3_55b375c5d22e_bb76f32061e3 | Собственный набор TLS и QUIC parameters, Initial1252, DCID8 / SCID3. |
| Safari 26.6.2 macOS | q13d0311h3_55b375c5d22e_f2a83c8e78ae | Initial1200, DCID8 / SCID0, H3 SETTINGS: QPACK capacity16383, blocked streams100 плюс GREASE. |
Нормализовали случайные значения GREASE, ключевые данные и идентификаторы соединений. Список trust_anchors сравнивали по идентификаторам, а не по случайному порядку, Root Store может обновляться отдельно от номера браузера. В Chrome QUIC из этого эталона нет того GREASE в signature_algorithms, который присутствует в его TCP ClientHello: переносить правило одного протокола на другой нельзя.

Как читать: ✓ - успех по указанному критерию, ✕ - отличие или цель не достигнута, △ - частичный результат или ограниченный объём подтверждения. TLS, TP, Initial/CID, SETTINGS и QPACK сравниваются с Chrome154 в обозначенной конфигурации, отличия других браузерных профилей указаны справа. Если H3 не работает, остальные ✕ означают недоступность результата, а не измеренные дефекты каждого поля. Для отказа0-RTT △ означает ответ без попытки ранних данных, поэтому восстановление не подтверждено.
| Решение / режим | H3 работает | TLS-поля | QUIC TP | Initial / CID | SETTINGS | QPACK | HTTP в 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 TP | Initial / CID | SETTINGS | QPACK | Конкретные отличия и итог |
|---|---|---|---|---|---|---|---|
| curl_cffi / Chrome150 | Chrome154 | ✕ | △ | ✕ | ✓ | △ | Нет trust_anchors51764, Initial1200 вместо1250. Постоянные SETTINGS и их порядок совпали. Полная QPACK-точность не подтверждена. |
| curl_cffi / Safari260 | Safari 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 / Edge101 | Edge154 | ✕ | △ | △ | ✕ | △ | Иной TLS, SETTINGS6=max →1=0 →7=0. Устаревший пресет не воспроизвёл текущую цель. |
| curl_cffi / Firefox147 | Firefox156 | ✕ | ✕ | △ | △ | △ | Другие шифры, группы и параметры QUIC. Остальные поля не получили полного подтверждения. |
| Go tls-client / 152_PSK | Chrome154 | ✕ | ✕ | ✕ | ✕ | ✕ | TCP-подобные TLS-расширения, Initial1280. SETTINGS только51=1 вместо1/6/7/51 + GREASE. QPACK кодирует ?0 с другим Huffman-флагом. |
| Go tls-client / 144_PSK | Chrome154 | ✕ | △ | △ | ✓ | ✕ | SETTINGS и порядок совпали, но TLS/QUIC154 - нет. QPACK: другой Huffman-флаг для ?0. Старый пресет исправил лишь часть полей. |
| noble-tls / native1.16.0 | Chrome154 / Safari26 | ✕ | △ | ✕ | ✕ | △ | Другие ClientHello, CID и SETTINGS. Полный QPACK обёртки отдельно не подтверждён, результаты Go нельзя автоматически переносить на неё. |
| httpcloak / Firefox-latest | Firefox156 | ✕ | ✕ | △ | △ | △ | Другой TLS. Окна TP4=15728640 и5/6/7=6291456 вместо25165824,12582912,1048576,1048576. |
| httpcloak / Chrome-latest | Chrome154 | ✓ | ✓ | ✓ | ✓ | △ | В проверенных TLS-полях, наборах TP, Initial/CID и SETTINGS дефектов не найдено. Полная QPACK-точность не подтверждена, поведенческие ошибки указаны в общей H3-таблице. |
| httpcloak / Safari iOS | Ограниченный Mac-эталон | △ | △ | △ | △ | △ | Окна QUIC отличаются от измеренного macOS Safari. В этой байтовой выборке отдельного iPhone-эталона не было: это не доказанный дефект iPhone-профиля. |
| impit / Chrome151 | Chrome154 | ✕ | ✕ | ✕ | ✕ | △ | 15 шифров вместо3 TLS1.3, TP4=max,5/6/7=1250000 вместо15728640 и6291456. Initial1200, иной SETTINGS. |
| CycleTLS / Chrome154 JA3 | Chrome154 | ✕ | ✕ | ✕ | △ | △ | Другой ClientHello, TP4=1048576,5/6/7=524288 вместо15728640 и6291456. Initial1280. Пользовательская JA3 не стала точным QUIC-профилем. |
| req/v3 / ForceHTTP3 | Chrome154 | ✕ | ✕ | △ | ✕ | △ | Иной 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 Proxy | Chrome/Edge: H3 сразу, 2+2 запроса, Firefox: сначала TCP. После простоя - PSK. | ✓ | ✓ | Все 6 профилей отправили ранний HTTP-запрос. 72 запроса без ошибок, 36 QUIC-соединений без различий в проверенных сырых полях. |
| curl_cffi | H3 сразу в режиме V3, 2+2 запроса, после простоя - PSK. | ✕ | △ | В проверенном Chrome150-профиле ранние данные не предлагались. Сырые отличия от 154 остаются. |
| Go tls-client | H3 сразу, 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-отличия остаются. |
| httpcloak | auto: все запросы по TCP. forced H3: после простоя q/qd - ошибки, qz - 2+2. | ✕ | ✕ | 4 ошибки из 24 обычных попыток. При отказе 0-RTT - ошибка, два штатных повтора её не устранили. |
| impit | H3 сразу при http3=True, 2+2 запроса, после простоя - PSK. | ✕ | △ | Ранние данные не предлагались, сырые отличия от выбранного браузера остаются. |
| req/v3 | auto: первый запрос по TCP, затем H3. forced: одно H3-соединение сохранилось через простой. | ✕ | △ | При принудительном закрытии сервером новое соединение тоже было fresh: PSK/0-RTT в проверенной конфигурации не получены. |
| CycleTLS | auto: 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 этим опытом не проверялось.

В одинаковом 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 macOS | Safari iPhone | Chrome Android | Safari: результат и отличия | 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 / iPhone | 4+4, PSK0, accepted0 | Повторные полные TLS/H2 соответствуют выбранному Safari26-классу, недостаток подтверждения снят. |
| Go tls-client: iOS26, macOS16 | 4+4, PSK0 | iOS26: свежие сводки соответствуют 26, macOS16 сохраняет устаревший TLS-профиль. |
| noble-tls: iOS26, macOS16 | 4+4, PSK0 | Тот же результат ядра, отсутствие PSK не исправляет старый macOS-пресет. |
| wreq26.4 / wreq-js26.4 | 4+4, PSK0 | Свежие Safari-сводки и отсутствие PSK соответствуют выбранному поведению, это не отменяет других сырых ограничений. |
| httpcloak Safari iOS | 4, PSK0 | Повторное полное рукопожатие, измеренное отличие H2 от Safari остаётся. |
| rnet Safari18.5 | 4, PSK0 | Свежая сводка соответствует классу 26, возраст пресета и сырые отличия сохраняются. |
| curl_cffi Safari260 | 4, предложено/принято PSK3 | Свежий TLS уже отличается, три повторных ClientHello возобновились, в отличие от выбранного Safari 26.6.2. |
| primp Safari26 | Получены 2 соединения из 4 попыток, PSK1 принят | Повторный ClientHello содержит 41 и сервер принял resumption, ещё два ответа потеряны при закрытииH2. Счёт неполного прогона не скрыт. |
| Python tls-client Safari15.6.1 | 4, 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/H2 | PSK41 |
|---|---|---|---|
| database chrome+ios / firefox+ios / edge+ios / safari+ios | По 3, всего 12 | Safari JA4 t13d2013h2_a09f3c656075_7f0f34a4126d, H2 m,s,a,p | Нет во всех 12 |
| По UA: CriOS / FxiOS / EdgiOS / EdgiOS iPad | По 3, всего 12 | Тот же Safari JA4 и H2 | Нет во всех 12 |
| Контроль Chrome Windows | 3 | Fresh 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: fresh | q13d0311h3_55b375c5d22e_f2a83c8e78ae | Нет 41/42 | 1200 |
| Живой Safari: PSK без 0-RTT | q13d0312h3_55b375c5d22e_151122171f7d | 41 последний, нет 42 | 1200 |
| Живой Safari: PSK с разрешённым 0-RTT | q13d0313h3_55b375c5d22e_6bb9a3ac9a4b | 42 между 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 / Edge | Firefox | Safari macOS / iPhone |
|---|---|---|---|
| Постоянные TLS-поля и SETTINGS | Совпали во всех 100 соединениях | Совпали во всех 50 соединениях | Совпали во всех 100 соединениях, macOS сравнивается с отдельным эталоном |
| Initial и CID | 1250/1250, DCID8, SCID0 | 1252/1252, плавающий DCID, SCID3 | 1200/1200, DCID8, SCID0 |
| TP и TLS-порядки | По 50 различных порядков TP, меняются GREASE и порядок QUIC-версий | TP постоянны, TLS перемешивается с хвостом 57,65037 | Все три допустимых поворота TP, чужих порядков нет |
| Кадры после SETTINGS | GREASE с телом 0–3 байта и PRIORITY_UPDATE | GREASE с телом 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 Chrome154 | BlankTrail1.3.15 |
|---|---|---|
| qd: динамическая таблица | Управляющий stream2, кодировщик QPACK stream10 | Управляющий stream2, кодировщик QPACK stream10 - совпало |
| qz: статическая форма | Только управляющий stream2 | Только управляющий stream2 - совпало |
| qz: повтор после простоя | PSK/0-RTT приняты, запрос в 0-RTT | PSK/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-транспорт формирует прокси.

Плюс: подключение разных стеков и стороннего ПО без исходников и интеграции 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
Как повторить сравнение
- Снимите результат настоящего целевого браузера и проверяемого клиента на tls.peet.ws/api/all, сохраните версии, профиль, ОС и JSON.
- Получите краткий детект на BlankTrail /client. Он помогает найти противоречия, но не подтверждает равенство всех байтов.
- Сравните фактический протокол, TLS-поля, SETTINGS и заголовки. При одинаковом JA4 проверьте payload расширений, включая trust_anchors.
- Проверьте новые соединения с сохранённым кэшем сессии. Для H3 отдельно различайте PSK, принятый0-RTT и сам ранний HTTP-запрос.
Подробная инструкция: pcap, ключи сессии, QPACK и тест отказа 0-RTT
BlankTrail /client даёт короткий результат: распознанный популярный клиент, заявленный браузер и найденные противоречия. Сохраните JSON, версию клиента, пресет, ОС и дату. Это удобный первый шаг, отсутствие findings не доказывает совпадение всех байтов.
- Получите независимый подробный результат. Откройте tls.peet.ws/api/all настоящим целевым браузером, затем запросите тот же URL библиотекой. Сохраните оба JSON. Сервис описан в репозитории TrackMe, /api/all возвращает собранные TLS и HTTP-поля. Не сравнивайте браузерную навигацию и библиотечный fetch без поправки на контекст HTTP-заголовков.
- Начните с транспорта. Проверьте 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, псевдозаголовки и обычные заголовки. Набор полей зависит от действительно использованного протокола.
- Не считайте закономерную случайность дефектом. Значения GREASE нормализуйте, сохраняя их количество и позиции, для Chrome/Edge снимите несколько новых соединений и проверьте перемешивание. random, session ID, ключевые байты key_share, билеты и binder не должны повторяться. Сравнивайте группы и длины ключей, а trust_anchors - по допустимому набору ID с учётом версии Root Store. Порядок, фиксированный у выбранного эталона, проверяйте отдельно.
- Для настоящих сырых байтов сделайте свой захват. /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 не заменяет этот шаг.
- Повторите 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. Сравнивайте соответствующий протокол и политику сервера.
- 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 автоматически.
- Поведение 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

На иллюстрации сохранены реальные краткие ответы /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 оценивается отдельно.
Результаты проверки отпечатков
| № | Клиент | Chrome154 | Safari26 | Firefox156 | Edge154 | Android154 | HTTP/3 | HTTP/2 | trust_anchors | Client Hints | GREASE | Повторный TLS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | BlankTrail Proxy | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 2 | httpcloak | ✓ | △ | ✕ | ✕ | △ | △ | △ | ✓ | △ | △ | ✓ |
| 3 | Go tls-client | ✓ | △ | ✕ | ✕ | △ | ✕ | △ | ✓ | △ | △ | △ |
| 4 | noble-tls | ✓ | △ | ✕ | ✕ | △ | ✕ | △ | ✓ | △ | △ | △ |
| 5 | wreq Python | △ | △ | ✕ | ✕ | △ | ✕ | ✓ | ✕ | ✕ | △ | ✓ |
| 6 | primp | △ | △ | ✕ | ✕ | △ | ✕ | ✓ | ✕ | ✕ | ✕ | ✕ |
| 7 | wreq-js | ✕ | △ | ✕ | ✕ | ✕ | ✕ | ✓ | ✕ | ✕ | △ | △ |
| 8 | curl_cffi / curl-impersonate | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✓ | ✕ | △ | ✕ | ✕ |
| 9 | rnet | ✕ | △ | ✕ | ✕ | ✕ | ✕ | ✓ | ✕ | ✕ | ✕ | △ |
| 10 | Python tls-client | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✓ | ✕ | △ | ✕ | △ |
| 11 | req/v3 | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | △ | ✕ | △ | ✕ | ✕ |
| 12 | uTLS + Go HTTP/2 | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✓ | △ | △ | △ |
| 13 | impit | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | △ | ✕ | ✕ |
| 14 | CycleTLS | ✕ | △ | ✕ | ✕ | ✕ | ✕ | △ | ✕ | △ | ✕ | △ |
| 15 | got-scraping | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✓ | ✕ | ✕ |
| 16 | HTTPX | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | △ | ✕ | △ | ✕ | ✕ |
| 17 | Go net/http | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | △ | ✕ | △ | ✕ | △ |
| 18 | Windows curl | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | △ | ✕ | ✕ |
| 19 | requests | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | △ | ✕ | ✕ |
| 20 | Node fetch | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | ✕ | △ | ✕ | △ |
Интеграция, профили и сопровождение
| № | Клиент | Интеграция | Профили | Обновления | Стек |
|---|---|---|---|---|---|
| 1 | BlankTrail Proxy | ✓ | ✓ | ✓ | ✓ |
| 2 | httpcloak | △ | △ | △ | △ |
| 3 | Go tls-client | △ | △ | △ | △ |
| 4 | noble-tls | ✓ | △ | △ | △ |
| 5 | wreq Python | ✓ | ✕ | △ | △ |
| 6 | primp | ✓ | ✕ | △ | △ |
| 7 | wreq-js | ✓ | ✕ | △ | △ |
| 8 | curl_cffi / curl-impersonate | ✓ | ✕ | △ | △ |
| 9 | rnet | ✓ | ✕ | △ | △ |
| 10 | Python tls-client | ✓ | ✕ | △ | △ |
| 11 | req/v3 | △ | △ | △ | △ |
| 12 | uTLS + Go HTTP/2 | ✕ | △ | ✕ | △ |
| 13 | impit | ✓ | ✕ | △ | △ |
| 14 | CycleTLS | △ | △ | ✕ | △ |
| 15 | got-scraping | ✓ | ✕ | ✕ | △ |
| 16 | HTTPX | ✓ | ✕ | ✕ | △ |
| 17 | Go net/http | ✓ | ✕ | ✕ | △ |
| 18 | Windows curl | ✓ | ✕ | ✕ | △ |
| 19 | requests | ✓ | ✕ | ✕ | △ |
| 20 | Node 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. Можно скачать приложение и самостоятельно протестировать нужные профили.

