UUID и ключи в VLESS Reality: объясняю для тех кто не разбирается в криптографии
Сел настраивать VLESS Reality на VPS — получил ошибку "VLESS handshake failed". Лог показывает "incorrect uuid". Начинаешь гуглить — видишь uuid, public key, shortId, spiderX. Без понимания криптографии собрать рабочий конфиг можно 3 часа. Я собрал за 15 минут — покажу как.
Почему UUID — это не просто пароль а идентификатор сессии
UUID (Universally Unique Identifier) в VLESS — 128-битное число формата xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. В Reality он выполняет две функции: идентифицирует клиента и участвует в генерации session key. Если UUID не совпадает между клиентом и сервером — соединение рвётся на этапе handshake.
Типичная ошибка новичка: берут UUID из примера конфига X-UI или 3x-UI. Проблема — эти панели генерируют UUID при создании инстанса, но при копировании конфига в клиент люди забывают подставить свой. Результат — incorrect uuid в логах.
Синтаксис валидного UUID: 550e8400-e29b-41d4-a716-446655440000. Все символы hex (0-9, a-f). Дефисы обязательны. Регистр не важен — большие/маленькие буквы равнозначны.
Как проверить UUID на сервере:
- Открываешь
/usr/local/etc/xray/config.jsonили путь к конфигу X-UI - Ищешь секцию
"inbounds"→"settings"→"clients"→"id" - Копируешь строку целиком
Как сгенерировать новый UUID:
cat /proc/sys/kernel/random/uuid
Или через uuidgen если стоит util-linux. Онлайн-генераторы не советую — доверяй только локальной генерации.
Public Key и Private Key в Reality — как они связаны с handshake
Reality работает на основе TLS 1.3 с шифрованием X25519. Ключевая пара: private key (PRKey) — хранится на сервере, public key (PUKey) — передаётся клиенту. Если PUKey не совпадает с PRKey — соединение валится с ошибкой "certificate verify failed" или "handshake failure".
Проблема: люди копируют PUKey из чужого конфига или генерируют на одном сервере, а используют на другом. Ошибка появляется не сразу — Reality сначала делает TLS-рукопожатие с сайтом-прикрытием, а потом проверяет ключи. Если не совпало — соединение разрывается.
Правильная генерация через xray:
xray x25519
Вывод:
Private key: WZR9VpM-zV8TvK0G4q6L3xQ2yF5bN7cD8eR1tH2jK3lM
Public key: 4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2g3h4i5j6k7l
Распространённая ошибка: в X-UI и 3x-UI при создании инстанса Reality поле "Public key" пустое по умолчанию. Некоторые заполняют его рандомными символами. Правильно — сгенерировать ключи через xray x25519 и скопировать оба. Public key идёт клиенту, Private key — в конфиг сервера.
Где смотреть ошибки:
- Сервер:
journalctl -u xray --since "5 min ago"или/var/log/xray/access.log - Клиент: включить логирование в Hiddify (Settings → Verbose log) или Happ
ShortId и SpiderX — зачем настраивать если Reality уже работает
ShortId — строка от 2 до 16 hex символов, которую Reality использует для идентификации потока. Если shortId не задан — xray использует дефолтный. Проблема: на congested серверах (много клиентов) дефолтный shortId увеличивает коллизии — два клиента могут получить одинаковый идентификатор, что вызовет "stream reset".
SpiderX — параметр для обфускации шаблона запроса. По-умолчанию он пустой, что делает паттерн трафика узнаваемым. DPI может его задетектить как VLESS.
Правильная настройка shortId:
- Генерируешь рандомный hex:
openssl rand -hex 4(4 байта = 8 символов) - Вставляешь в
"shortIds"в конфиге сервера - Копируешь тот же shortId в клиентский конфиг
Пример конфига для X-UI:
"realitySettings": {
"show": false,
"xver": 0,
"dest": "www.microsoft.com:443",
"serverNames": ["www.microsoft.com"],
"privateKey": "WZR9VpM-zV8TvK0G4q6L3xQ2yF5bN7cD8eR1tH2jK3lM",
"shortIds": ["a1b2c3d4"],
"settings": {
"publicKey": "4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2g3h4i5j6k7l"
}
}
Ошибка — использовать один shortId для всех клиентов. На 10+ клиентах лучше назначить каждому свой shortId. Или оставить по-умолчанию если канал не загружен.
Проверка конфига: убиваем 80% ошибок за 5 минут
Беру сервер на МТС с VPS в Нидерландах. Конфиг VLESS Reality через Hiddify на Android. Вот как выглядит рабочий сценарий:
- Генерирую UUID:
cat /proc/sys/kernel/random/uuid→3f1d2e8a-4b5c-6789-0123-456789abcdef - Генерирую ключи:
xray x25519→ копирую оба - Настраиваю shortId:
openssl rand -hex 4→a1b2c3d4 - Проверяю конфиг синтаксис:
xray -test -config /usr/local/etc/xray/config.json
Результат:
- handshake: 180ms
- первый пакет: 220ms
- пропуск: 58 Мбит/с
Никакого incorrect uuid, certificate verify failed или stream reset.
Если ошибка появилась после изменения конфига:
- Проверь UUID на сервере и клиентах — отличается допустимо
- Проверь public key (клиент) = public key (сервер) — разные если не скопировал
- Проверь shortId — hex без дефисов
Альтернативы: когда Reality не заводится
Trojan с WebSocket — альтернатива если Reality не работает из-за блокировок на уровне DPI. Не использует криптографию на уровне клиент-сервер, только пароль. Минус — трафик видно, но он шифрованный.
VLESS с WebSocket (без Reality) — работает через обычный TLS, без X25519. Настройка проще — не нужно генерировать ключи, shortId, spiderX. Минус — легче детектится DPI.
Shadowsocks с AEAD — классика. Не требует UUID или Public Key. Минус — легко отличить от обычного HTTPS.
Я использую VLESS Reality для стабильного доступа на Tele2 и Мегафон. На Билайне и Ростелекоме — VLESS WebSocket как fallback.
Частые вопросы
Что делать если при подключении VLESS Reality ошибка incorrect uuid?
Проверь UUID в конфиге клиента (например в Hiddify раздел "Config" → "UUID") и сравни с тем что на сервере (файл /etc/x-ui/xray/config.json или панель X-UI → Inbounds → твой инстанс → клиенты). 80% случаев — копипаст чужого конфига. Сгенерируй новый через cat /proc/sys/kernel/random/uuid и пропиши в оба.
Как сгенерировать public key для Reality если нет xray на VPS?
Установи xray на любой VPS, запусти xray x25519. Или используй скрипт установки например от 3x-UI (одна команда). Онлайн-генераторы не советую — ключи могут быть подсмотрены. После генерации пропиши PrivateKey в конфиг сервера, PublicKey в клиентский конфиг.
Что такое shortId в VLESS Reality и как его настроить?
ShortId — идентификатор потока до 16 hex символов. Генерируется локально: openssl rand -hex 4. Вставляется в конфиг сервера в поле "shortIds": ["a1b2c3d4"]. На клиенте тот же shortId в разделе "Reality" → "shortId". Если не указать — xray использует дефолтный, что на congested серверах вызывает stream reset.
Почему VLESS Reality не работает на Tele2 но работает на МТС?
Разные провайдеры блокируют по-разному. Tele2 использует Deep Packet Inspection от Cisco — он лучше детектит Reality. Решение: добавить в spiderX значение "/" или поменять dest на www.bing.com:443. Или использовать VLESS WebSocket как fallback.
Можно ли использовать один UUID для нескольких клиентов? Технически да, но не советую. Reality идентифицирует сессию по UUID+shortId. Если два клиента с одинаковым UUID одновременно активны — возможны коллизии и сброс соединения. Сгенерируй каждому клиенту свой UUID и shortId. Займёт 30 секунд.
UUID, Public Key и ShortId — три параметра которые убивают 90% ошибок в VLESS Reality. Сгенерировал локально, проверил на сервере, прописал в клиенте. Всё. Если нужен готовый конфиг без танцев с генерацией — пользуйся сервисами которые это автоматизируют. Попробовать @VPNChill_bot — 3 дня бесплатно →