TLS в mihomo — обзор
В отличие от Xray и sing-box, в mihomo нет консолидированного блока TLS. Каждый адаптер прокси и каждый входящий слушатель несёт собственный набор TLS-полей прямо на объекте прокси. Эта страница описывает повторяющийся набор полей, чтобы не открывать его заново на каждой странице протокола.
Общий набор TLS-полей
Эти поля встречаются практически на каждом исходящем mihomo, работающем по TLS (VLESS, VMess, Trojan, Hysteria2, TUIC, AnyTLS, HTTP, SOCKS, обычный Shadowsocks через плагины):
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
tls | bool | false | Главный переключатель — обернуть поток в TLS. Некоторые протоколы (Hysteria2, TUIC, AnyTLS) требуют TLS и игнорируют этот флаг. |
sni | string | (имя из server) | TLS Server Name Indication. По умолчанию берётся из поля server. |
servername | string | (sni) | Альтернативное имя (более старые адаптеры). Эквивалент sni. |
alpn | []string | (нет) | Список ALPN, объявляемый в TLS-рукопожатии. Типичные значения: [h2, http/1.1] для VLESS/VMess/Trojan; [h3] для протоколов на HTTP/3. |
skip-cert-verify | bool | false | Отключить проверку сертификата. Только для тестирования. |
name-cert-verify | string | (не задано) | Проверять сертификат сервера по этому имени хоста вместо SNI. Позволяет объявить в ClientHello одно имя, а сертификат валидировать для другого. |
fingerprint | string | (не задано) | Закрепить сертификат сервера за отпечатком SHA-256 (hex в нижнем регистре, без двоеточий). |
certificate | string | (не задано) | Клиентский сертификат для mTLS. |
private-key | string | (не задано) | Приватный ключ, соответствующий certificate. |
client-fingerprint | string | (global) | Отпечаток ClientHello в uTLS. При отсутствии берётся из верхнеуровневого global-client-fingerprint. |
Набор на стороне входящего слушателя немного отличается:
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
certificate | string | (обязательно) | Сертификат сервера (путь или встроенный PEM). |
private-key | string | (обязательно) | Приватный ключ сервера. |
client-auth-type | string | no-client-cert | Режим аутентификации клиента в mTLS. Пять значений: no-client-cert, request-client-cert, require-any-client-cert, verify-client-cert-if-given, require-and-verify-client-cert. |
client-auth-cert | string | (не задано) | Набор CA, принимаемых как корневые для клиентов, когда client-auth-type требует проверки. |
ech-key | string | (не задано) | Конфигурационный материал ECH. См. ECH. |
Значения client-fingerprint
Реализация uTLS в mihomo принимает:
| Значение | Имитирует |
|---|---|
chrome | Chrome 100+ |
firefox | Firefox 102+ |
safari | Safari 16+ |
ios | iOS Safari 16+ |
android | Android Chrome |
edge | Edge Chromium |
360 | 360 Secure Browser |
qq | QQ Browser |
random | Случайно выбрать один из перечисленных для каждого соединения |
randomized | Генерировать синтетический случайный отпечаток на каждое соединение |
Если не заданы ни client-fingerprint на прокси, ни верхнеуровневый global-client-fingerprint, mihomo отправляет стандартный ClientHello Go crypto/tls (DPI распознаёт его как «не браузер»).
Подблоки с TLS
Когда протоколу нужны настройки за пределами плоского набора полей, mihomo вкладывает их в именованные подблоки. Самые распространённые:
reality-opts— клиентская конфигурация REALITY.ech-opts— конфигурация Encrypted Client Hello.shadow-tls-opts({ password, version }),restls-opts({ password, version-hint, restls-script }) иjls-opts({ username, password }) — блоки TLS-камуфляжа Shadow-TLS / Restls / JLS, доступные на исходящих AnyTLS, Trojan, VLESS и VMess (а также в obfs-плагинах Shadowsocks и Snell под собственными именами ключей). На одном прокси эти блоки — вместе сreality-opts— взаимоисключающие: включайте не более одного. Соответствия на стороне слушателя —shadow-tls,res-tlsиjls-config.ws-opts.tls,grpc-opts.tls,h2-opts.tls— переключатели TLS транспортного уровня внутри блока транспорта. Большинство пользователей вместо них ставятtls: trueна уровне протокола и не трогают эти поля.
Где настраивать TLS в mihomo
Три места, о которых стоит помнить:
- На исходящем — прямо в записи прокси в
proxies:. Типичное место для клиентского TLS. - На входящем — в записи слушателя в
listeners:. Параcertificate/private-keyплюс опциональные поля mTLS. - Верхнеуровневый блок
tls:— см. TLS. Используется толькоexternal-controller-tls(конечной точкой Clash API). Он не является умолчанием для адаптеров прокси.
Сравнение с другими ядрами
- Xray-core собирает всё в
streamSettings.tlsSettings(на соединение) иstreamSettings.security: "tls". См. TLS — Xray-core. - sing-box использует единый встроенный блок
tls: { ... }на каждом входящем и исходящем, где REALITY / ECH / uTLS — подполя. См. TLS — sing-box.
