Протоколы
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).
Источники
- refraction-networking/utls — основной репозиторий.
- Gao et al. — Detecting Probe-resistant Proxies (NDSS 2020).
- Salesforce JA3 fingerprinting — оригинальный JA3-проект.
- JA4+ documentation — преемник JA3.