Перейти к содержимому

👻 uTLS: prizrak-utls

uTLS — библиотека, которая подделывает TLS-отпечаток (ClientHello) под настоящий браузер. От неё зависит, каким браузером выглядит подключение для client-fingerprint и REALITY.

mihomo использует metacubex/utls v1.8.8. Prizrak-Core использует свой форк legiz-ru/prizrak-utls (ветка v1.9.0-mod-meta-mldsa-chr155). Он состоит из трёх частей:

  1. Основа — ветка v1.9.0-mod-meta от metacubex. Это более новая линия, чем v1.8.8 в mihomo, со всеми доработками metacubex.
  2. Свежий апстрим refraction-networking/utls: синхронизация с crypto/tls из Go 1.27.1, отпечаток Chrome 155, исправления распаковки сжатых сертификатов, исправления GREASE и PSK, обмен ключами MLKEM1024. Форк при этом по-прежнему собирается на Go 1.20.
  3. REALITY ML-DSA-65 — см. раздел REALITY.
  4. Ключи всех key share: хранятся ключи каждого классического key share, и сервер может выбрать любой из них (бэкпорт refraction-networking/utls#416, как в Jolymmiles/utls).
client-fingerprintmihomoPrizrak-Core
chromeChrome 133Chrome 155
firefoxFirefox 120Firefox 148
safariSafari 16.0Safari 26.3
ios, android, edge, 360, qqбез измененийбез изменений

В Prizrak-Core отпечатки firefox и safari тоже содержат постквантовый обмен ключами X25519MLKEM768, как у настоящих браузеров этих версий. В mihomo он есть только у chrome.

  • randomized всегда предлагает X25519MLKEM768 вместе с его ключом. uTLS дважды и независимо решал, предлагать ли группу и слать ли её key share. Часть процессов слала группу без ключа: REALITY такие ClientHello отклонял, а сервер, предпочитающий постквантовый обмен, отвечал HelloRetryRequest, который uTLS не проходил. Часть слала ключ без группы, и OpenSSL такое отклоняет. Теперь hello всегда предлагает и группу, и ключ и шлёт key share только для X25519MLKEM768 и X25519, как Chrome. Это то же исправление, что в Jolymmiles/Xray-core.
  • random больше не выбирает ios. ios (iOS 14) не шлёт X25519MLKEM768, а серверы REALITY в Xray такие ClientHello отклоняют, поэтому random на части запусков с ними не работал. Теперь он выбирает chrome, safari или firefox.
  • firefox против серверов, выбирающих P-256. Отпечатки Firefox шлют key share для X25519 и P-256, а uTLS хранил ключ только первого: если сервер выбирал P-256, рукопожатие падало с tls: invalid server key share. Теперь хранятся ключи всех key share (пункт 4 выше). ClientHello не меняется.