Народный

Протоколы

uTLS — TLS fingerprint mimicry

Go-библиотека, позволяющая клиенту подделать TLS-fingerprint (JA3) под конкретный браузер: Chrome, Firefox, Safari, iOS. Используется почти всеми современными антицензурными протоколами.

Определение

uTLS — форк стандартной Go-библиотеки crypto/tls, в котором можно явно задавать порядок и состав TLS-расширений в ClientHello, эмулируя fingerprint конкретного браузера. Создан Gao et al. в 2018, развивается командой refraction-networking. На 2026 — стандартный TLS-стек в xray-core, sing-box, V2Ray, Hysteria 2, NaïveProxy.

Цель — не дать DPI отличить VPN-клиента от настоящего Chrome / Firefox по JA3 или JA4 отпечатку TLS ClientHello.

Как работает

Обычный TLS-клиент (curl, Go-net, Python requests) генерирует ClientHello со специфичным порядком cipher_suites, supported_groups, extensions. Этот порядок и есть JA3 — хэш строки version,ciphers,extensions,curves,formats. У каждого браузера и каждой библиотеки свой JA3, и DPI использует это.

uTLS обходит проблему так:

import utls "github.com/refraction-networking/utls"

conn := utls.UClient(rawConn, &utls.Config{ServerName: "example.com"},
                     utls.HelloChrome_Auto)
if err := conn.Handshake(); err != nil { ... }

Профили (utls.ClientHelloID) — набор готовых пресетов:

  • HelloChrome_Auto — последний стабильный Chrome (обновляется с релизом библиотеки).
  • HelloFirefox_Auto, HelloSafari_Auto, HelloIOS_Auto, HelloAndroid_11_OkHttp и т.д.
  • HelloRandomized — случайный набор существующих браузерных профилей.
  • HelloCustom — полностью кастомная ClientHello-спека (продвинутый use case).

При handshake uTLS строит ClientHello байт-в-байт как у целевого браузера: тот же GREASE-pattern, тот же порядок ALPN, те же supported_versions. JA3-хэш совпадает с настоящим Chrome.

Важное ограничение: совпадение fingerprint’а не означает, что VPN-сервер будет вести себя как Google. ТСПУ может использовать JA3 как первый фильтр, но после handshake поведенческий анализ может выдать VPN всё равно — поэтому uTLS работает только в связке с Reality (правильное содержимое handshake) и XTLS Vision (нет TLS-in-TLS).

Почему это важно для пользователя VPN

Без uTLS любой VPN-клиент на Go или Rust палится по JA3 за 5 минут. Это базовый слой защиты, без которого вся остальная криптография бессмысленна — DPI отбросит handshake ещё до того, как клиент договорится о ключах.

Проверить, использует ли ваш VPN-клиент uTLS:

  • xray-core / sing-box. В конфиге смотрим параметр fingerprint. Значения: chrome, firefox, safari, ios, android, edge, 360, qq, random, randomized. Если параметр отсутствует или равен пустой строке — uTLS выключен, клиент палится по дефолтному Go-JA3.
  • Десктоп-приложения (AmneziaVPN, Hiddify, NekoBox). uTLS включён по умолчанию, профиль обычно chrome.

Юзеру: при настройке кастомного xray-конфига всегда задавайте fingerprint: chrome (или иной браузер). Не забывайте обновлять клиент — uTLS-профили устаревают с новыми релизами Chrome, и старая библиотека выдаёт fingerprint версии Chrome 110, тогда как настоящий браузер уже на 130.

Связанные термины

JA3 / JA4 — отпечаток, который uTLS подделывает. TLS 1.3 — нижний слой. VLESS Reality, XTLS — протоколы, в которых uTLS обязателен. NaïveProxy — альтернативный подход (использует реальный Chrome network stack, не uTLS).

Источники