Skip to content

TLS в mihomo — обзор

В отличие от Xray и sing-box, в mihomo нет консолидированного блока TLS. Каждый адаптер прокси и каждый входящий слушатель несёт собственный набор TLS-полей прямо на объекте прокси. Эта страница описывает повторяющийся набор полей, чтобы не открывать его заново на каждой странице протокола.

Общий набор TLS-полей

Эти поля встречаются практически на каждом исходящем mihomo, работающем по TLS (VLESS, VMess, Trojan, Hysteria2, TUIC, AnyTLS, HTTP, SOCKS, обычный Shadowsocks через плагины):

ПолеТипПо умолчаниюОписание
tlsboolfalseГлавный переключатель — обернуть поток в TLS. Некоторые протоколы (Hysteria2, TUIC, AnyTLS) требуют TLS и игнорируют этот флаг.
snistring(имя из server)TLS Server Name Indication. По умолчанию берётся из поля server.
servernamestring(sni)Альтернативное имя (более старые адаптеры). Эквивалент sni.
alpn[]string(нет)Список ALPN, объявляемый в TLS-рукопожатии. Типичные значения: [h2, http/1.1] для VLESS/VMess/Trojan; [h3] для протоколов на HTTP/3.
skip-cert-verifyboolfalseОтключить проверку сертификата. Только для тестирования.
name-cert-verifystring(не задано)Проверять сертификат сервера по этому имени хоста вместо SNI. Позволяет объявить в ClientHello одно имя, а сертификат валидировать для другого.
fingerprintstring(не задано)Закрепить сертификат сервера за отпечатком SHA-256 (hex в нижнем регистре, без двоеточий).
certificatestring(не задано)Клиентский сертификат для mTLS.
private-keystring(не задано)Приватный ключ, соответствующий certificate.
client-fingerprintstring(global)Отпечаток ClientHello в uTLS. При отсутствии берётся из верхнеуровневого global-client-fingerprint.

Набор на стороне входящего слушателя немного отличается:

ПолеТипПо умолчаниюОписание
certificatestring(обязательно)Сертификат сервера (путь или встроенный PEM).
private-keystring(обязательно)Приватный ключ сервера.
client-auth-typestringno-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-certstring(не задано)Набор CA, принимаемых как корневые для клиентов, когда client-auth-type требует проверки.
ech-keystring(не задано)Конфигурационный материал ECH. См. ECH.

Значения client-fingerprint

Реализация uTLS в mihomo принимает:

ЗначениеИмитирует
chromeChrome 100+
firefoxFirefox 102+
safariSafari 16+
iosiOS Safari 16+
androidAndroid Chrome
edgeEdge Chromium
360360 Secure Browser
qqQQ 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

Три места, о которых стоит помнить:

  1. На исходящем — прямо в записи прокси в proxies:. Типичное место для клиентского TLS.
  2. На входящем — в записи слушателя в listeners:. Пара certificate / private-key плюс опциональные поля mTLS.
  3. Верхнеуровневый блок 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.

Core Tutorial от Argsment