Skip to content

ECH — Xray-core

Encrypted Client Hello (ECH) скрывает SNI от наблюдателей на пути, шифруя ClientHello открытым ключом, опубликованным сервером. Xray предоставляет ECH тремя полями в стандартном блоке tlsSettings — отдельной структуры ECH нет.

Конфигурация

ECH живёт в streamSettings.tlsSettings:

ПолеСторонаТипПо умолчаниюДопустимые значенияОписание
echServerKeysВходящаяstring(не задано)связка ключей ECH в base64Набор серверных ключей ECH. Генерируется вместе с вашим TLS-сертификатом.
echConfigListИсходящаяstring(не задано)ECHConfigList в base64Закрепить конкретный список конфигураций. Если не задан, клиент обнаруживает его автоматически через DNS-записи HTTPS.
echSockoptИсходящаяSocketConfig(не задано)параметры сокетаПараметры сокета, применяемые к DNS-запросу обнаружения ECH.

Примеры

Входящее подключение — обслуживание ECH вместе с обычным TLS:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "certificates": [{ "certificateFile": "/etc/ssl/cert.pem", "keyFile": "/etc/ssl/key.pem" }],
      "echServerKeys": "<base64 ECHConfigList + private keys>"
    }
  }
}

Исходящее подключение — автообнаружение ECH через DNS-записи HTTPS:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "alpn": ["h2", "http/1.1"]
    }
  }
}

ECH оппортунистичен: когда явный echConfigList не задан, Xray запрашивает DNS-запись HTTPS для serverName и использует опубликованную конфигурацию, если она найдена.

Исходящее подключение — закрепление конкретной конфигурации ECH:

json
{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "serverName": "example.com",
      "echConfigList": "<base64 ECHConfigList>"
    }
  }
}

Примечания

  • ECH требует TLS 1.3. Задайте minVersion: "1.3", если хотите принудительно закрепить это на уровне протокола.
  • Значение serverName для ECH (example.com выше) — это публичное имя, SNI, видимый на проводе. «Внутреннее» (inner) ServerName — то, которое шифрует ECH, — выводится из фактического адреса назначения запроса.
  • Закрепляйте echConfigList только когда контролируете обе стороны. Автообнаружение надёжнее: опубликованная конфигурация может ротироваться без перенастройки клиента.

Сравнение с другими ядрами

  • У sing-box есть отдельные структуры InboundECHOptions и OutboundECHOptions в tls.ech. См. ECH — sing-box.
  • mihomo предоставляет на каждом прокси блок ech-opts с тремя полями (enable, config, query-server-name). См. ECH — mihomo.

Исходный код: infra/conf/transport_security.go:316-318 · v26.7.28 (5ca6f4b)

Core Tutorial от Argsment