← Назад в базу знаний

Почему сайты блокируют VPN по TLS fingerprint: как работает JA3 и его обход

Почему сайты блокируют VPN по TLS fingerprint: как работает JA3 и его обход

JA3: цифровой отпечаток, который палит твой VPN

VPN-сервисы умирают тихо. Не от DDoS, не от цен на железо. Их убивают строки кода в библиотеке OpenSSL.

Каждое TLS-соединение начинается с ClientHello — пакета, где клиент заявляет: "я умею такие-то шифры, поддерживаю такие-то расширения". Сервер смотрит на этот пакет, и если видит нечто подозрительное — рвёт соединение.

JA3 — это хеш, который вычисляется из полей ClientHello: версия TLS, список CipherSuite, расширения, кривые эллиптических кривых. Один и тот же стек приложений всегда генерирует одинаковый хеш. Разные стеки — разные хеши.

Проблема VPN в том, что OpenVPN, WireGuard и даже Shadowsocks поверх TLS используют системную библиотеку OpenSSL. А она у всех одинаковая. Один и тот же fingerprint у тысяч пользователей одного VPN-провайдера.

Почему fingerprint работает лучше, чем проверка IP

IP-адреса легко менять. Дата-центры — плодить. А вот TLS-стек — это сложная система, которая зависит от версии OpenSSL, способа компиляции, настроек по умолчанию.

Пример: возьмём клиент Shadowsocks с TLS-туннелем. Он использует OpenSSL 3.0.8 с дефолтными настройками. Сервер видит JA3, который совпадает с тысячами других таких же клиентов. Один запрос к базе — и весь трафик этого провайдера летит в чёрный список.

Сайты с защитой от ботов собирают JA3 в реальном времени. Cloudflare, Imperva, Akamai — все они имеют базы отпечатков известных VPN-клиентов.

Как работает блокировка на практике

Пользователь подключается к сайту через VPN. TLS handshake происходит между клиентом и CDN. CDN вычисляет JA3, сверяет с базой, находит совпадение с известным VPN-клиентом. Дальше — капча или просто отказ.

Важный момент: блокировка происходит на уровне CDN, до того как запрос достигнет origin-сервера. Поэтому смена IP на VPN-стороне не помогает. Fingerprint остаётся прежним.

Пример из реальной жизни: сервис с защитой от ботов блокировал пользователей, которые использовали OpenVPN с TLS-шифрованием. Все они имели одинаковый JA3, потому что использовали одну и ту же версию OpenSSL из репозитория Ubuntu.

```bash

openssl version

OpenSSL 3.0.10 1 Aug 2023

```

Одна команда — и весь трафик этого стека стал "подозрительным".

Обход: меняем fingerprint на лету

Есть несколько путей. Самый простой — использовать библиотеку BoringSSL вместо OpenSSL. Это форк от Google, который используется в Chrome. Его fingerprint отличается от OpenSSL.

Но и это не панацея. Сайты с серьёзной защитой проверяют не только JA3, но и другие параметры: порядок cipher suite, значения расширений, тайминги.

```python

import ssl

import socket

context = ssl.create_default_context()

with socket.create_connection(("example.com", 443)) as sock:

with context.wrap_socket(sock, server_hostname="example.com") as ssock:

print(ssock.version())

```

Этот код использует системный OpenSSL. Fingerprint будет стандартным. А вот если использовать pyopenssl с BoringSSL — картина меняется.

uTLS: библиотека для подмены отпечатков

uTLS — это Go-библиотека, которая позволяет имитировать fingerprint других приложений. Она эмулирует ClientHello от Chrome, Firefox, Safari и других браузеров.

Принцип работы: библиотека перехватывает формирование ClientHello и подставляет поля, характерные для целевого приложения. При этом cipher suite и расширения выглядят так, будто их сгенерировал Chrome.

```go

import (

"github.com/refraction-networking/utls"

)

func dialWithChromeFingerprint(addr string) (*utls.UConn, error) {

conn, err := net.Dial("tcp", addr)

if err != nil {

return nil, err

}

uconn := utls.UClient(conn, &utls.Config{ServerName: "example.com"}, utls.HelloChrome_Auto)

return uconn, nil

}

```

Этот код создаёт TLS-соединение, fingerprint которого неотличим от Chrome. Для сайта это выглядит как обычный браузерный трафик.

Ограничения подмены fingerprint

Подмена JA3 не решает всех проблем. Сайты с глубокой защитой анализируют не только ClientHello, но и поведение после установки соединения.

Например, если после TLS-handshake клиент отправляет HTTP/2-заголовки, которые не соответствуют fingerprint Chrome — блокировка всё равно сработает. Нужно подделывать весь стек, а не один пакет.

Ещё один нюанс: TLS-сессии с подменённым fingerprint могут работать медленнее. uTLS тратит время на подбор параметров, а это дополнительные миллисекунды на каждое соединение.

Практический пример: настройка Xray с подменой fingerprint

Xray — это прокси, который поддерживает подмену TLS-отпечатков через uTLS. Настройка проста:

```json

{

"inbounds": [{

"port": 1080,

"protocol": "socks"

}],

"outbounds": [{

"protocol": "vless",

"settings": {

"vnext": [{

"address": "server.example.com",

"port": 443,

"users": [{

"id": "uuid-here",

"encryption": "none"

}]

}]

},

"streamSettings": {

"network": "tcp",

"security": "tls",

"tlsSettings": {

"fingerprint": "chrome"

}

}

}]

}

```

Параметр `fingerprint: "chrome"` включает подмену JA3 на отпечаток Chrome. Всё остальное остаётся как есть.

Почему fingerprint не работает для всех случаев

Есть сайты, где блокировка по JA3 неэффективна. Это ресурсы, которые обслуживают огромное количество легитимного трафика с разных устройств. Например, Google или YouTube. У них fingerprint-база слишком разнородна.

А вот для сайтов с защитой от парсинга — Ozon, Wildberries, Avito — JA3-блокировки работают отлично. У них трафик в основном с браузеров, и любой нестандартный fingerprint сразу виден.

Реальные кейсы блокировки

Сервис аналитики с защитой от ботов заблокировал доступ для пользователей VPN-провайдера. Оказалось, что все клиенты использовали один и тот же TLS-стек. Решение — переключение на BoringSSL и подмена fingerprint.

Интернет-магазин с высокой посещаемостью внедрил JA3-фильтрацию и отсекал до 30% трафика от VPN. После добавления uTLS в клиентскую часть, показатель упал до 5%.

Провайдер прокси-сервиса заметил, что его клиенты массово получают капчу на крупных сайтах. Анализ показал: Cloudflare начала блокировать fingerprint их TLS-библиотеки. Решение — обновление до версии с поддержкой uTLS.

Будущее: от JA3 к JA4

JA3 — не панацея. У него есть недостатки: он не учитывает параметры TLS 1.3, не различает разные версии протокола. Поэтому появился JA4 — улучшенный формат отпечатков.

JA4 анализирует больше полей: версию TLS, cipher suite, расширения, а также параметры HTTP/2. Это делает его более точным. Но и обходных путей становится больше — библиотеки вроде uTLS постоянно обновляются.

Гонка вооружений продолжается. Каждый новый метод защиты порождает новый метод обхода. И так будет всегда, пока существует интернет.

Выводы

JA3-блокировки — серьёзная проблема для VPN-сервисов. Но она решаема. Подмена fingerprint через uTLS или BoringSSL позволяет обойти большинство ограничений.

Главное — не останавливаться на одном методе. Комбинируйте подмену отпечатков с правильной настройкой HTTP/2 и поведенческих аспектов. Тогда ваш трафик будет выглядеть максимально естественно.

И помните: ни один метод не даёт 100% гарантии. Сайты с самыми продвинутыми системами защиты всегда найдут способ отличить бота от человека. Вопрос только в цене этого обнаружения.

✔️Купить прокси