Skip to content

TLS — sing-box

Каждый входящий и исходящий sing-box встраивает блок tls: { ... } через InboundTLSOptionsContainer / OutboundTLSOptionsContainer. Тот же блок содержит подблоки REALITY, ECH и uTLS как вложенные параметры — это не отдельные функции верхнего уровня.

Входящий tls

ПолеТипПо умолчаниюДопустимые значенияОписание
enabledboolfalsetrue | falseГлавный переключатель. При false остальная часть блока игнорируется.
server_namestring(inferred from SNI)<hostname>Ожидаемое имя сервера для выпуска сертификата через ACME. Обязательно, если задан `acme`.
insecureboolfalsetrue | falseПропустить проверку TLS. Только для тестов.
alpnbadoption.Listable[string][]<ALPN string>Список ALPN, предлагаемый клиентам.
min_versionstring1.21.0 | 1.1 | 1.2 | 1.3Минимально допустимая версия TLS.
max_versionstring1.31.0 | 1.1 | 1.2 | 1.3Максимально допустимая версия TLS.
cipher_suitesbadoption.Listable[string](library default)<cipher>Переопределить список наборов шифров (только TLS 1.2).
curve_preferencesbadoption.Listable[CurvePreference](library default)P256 | P384 | P521 | X25519 | X25519MLKEM768Список предпочитаемых кривых для обмена ключами.
certificatebadoption.Listable[string][]<PEM block>Встроенный PEM-сертификат сервера. Форма списка поддерживает полную цепочку.
certificate_pathstring(unset)<PEM file path>Путь к сертификату сервера.
client_authenticationClientAuthTypenono | request | require-any | verify-if-given | require-and-verifyПолитика клиентской аутентификации mTLS. Соответствует значениям ClientAuthType из crypto/tls.
client_certificatebadoption.Listable[string][]<PEM block>Доверенные корневые сертификаты клиентов (mTLS).
client_certificate_pathbadoption.Listable[string][]<PEM file path>Доверенные корневые сертификаты клиентов в виде путей.
client_certificate_public_key_sha256badoption.Listable[[]byte][]<SHA-256 bytes>Закрепить клиентский сертификат по SHA-256 открытого ключа. Полезно при выпуске одноразовых клиентских сертификатов.
keybadoption.Listable[string][]<PEM block>Встроенный приватный ключ сервера.
key_pathstring(unset)<file path>Путь к приватному ключу сервера.
kernel_txboolfalsetrue | falseKTLS в Linux — переложить TLS-шифрование исходящего трафика на ядро. Требует поддержки TLS в ядре и нужных криптомодулей.
kernel_rxboolfalsetrue | falseKTLS в Linux для входящего трафика.
acme*InboundACMEOptions(unset)InboundACMEOptionsАвтоматический выпуск сертификатов Let's Encrypt. Взаимоисключим с явными `certificate`/`key`.
ech*InboundECHOptions(unset)InboundECHOptionsКонфигурация Encrypted Client Hello.
reality*InboundRealityOptions(unset)InboundRealityOptionsСерверная конфигурация REALITY. Взаимоисключима с обычным TLS — REALITY заменяет TLS-рукопожатие.

Исходный код: option/tls.go:12-34 · зафиксировано на v1.13.15 (3708fa1)

Исходящий tls

ПолеТипПо умолчаниюДопустимые значенияОписание
enabledboolfalsetrue | falseГлавный переключатель.
disable_sniboolfalsetrue | falseПолностью убрать расширение SNI из ClientHello.
server_namestring(server address)<hostname>SNI, отправляемый серверу, и имя, сверяемое с конечным (leaf) сертификатом.
insecureboolfalsetrue | falseПропустить проверку сертификата сервера.
alpnbadoption.Listable[string][]<ALPN string>Список ALPN, предлагаемый серверу.
min_versionstring1.21.0 | 1.1 | 1.2 | 1.3Минимально допустимая версия TLS.
max_versionstring1.31.0 | 1.1 | 1.2 | 1.3Максимально допустимая версия TLS.
cipher_suitesbadoption.Listable[string](library default)<cipher>Переопределить список наборов шифров.
curve_preferencesbadoption.Listable[CurvePreference](library default)<see inbound>Предпочтения кривых для обмена ключами.
certificatebadoption.Listable[string][]<PEM block>Доверенные сертификаты ЦС, добавляемые к системному корневому хранилищу. Используйте с `insecure: false` для серверов с самоподписанными сертификатами.
certificate_pathstring(unset)<file path>Доверенные ЦС в виде пути.
certificate_public_key_sha256badoption.Listable[[]byte][]<SHA-256 bytes>Закрепить сертификат сервера по SHA-256 открытого ключа.
client_certificatebadoption.Listable[string][]<PEM block>Клиентский сертификат (mTLS).
client_certificate_pathstring(unset)<file path>Клиентский сертификат в виде пути.
client_keybadoption.Listable[string][]<PEM block>Приватный ключ клиента.
client_key_pathstring(unset)<file path>Приватный ключ клиента в виде пути.
fragmentboolfalsetrue | falseФрагментация рукопожатия на уровне TCP. Разбивает ClientHello по пакетам, чтобы обойти DPI, работающий по SNI.
fragment_fallback_delaybadoption.Duration500ms<duration>Если фрагментированное рукопожатие не завершилось за это время, повторить попытку без фрагментации.
record_fragmentboolfalsetrue | falseФрагментация на уровне TLS-записей (агрессивнее `fragment` — разбивает сам поток TLS-записей, а не только TCP-пакеты).
kernel_txboolfalsetrue | falseKTLS в Linux для исходящего трафика.
kernel_rxboolfalsetrue | falseKTLS в Linux для входящего трафика.
ech*OutboundECHOptions(unset)OutboundECHOptionsКонфигурация ECH. Если не задана, ECH не используется (кроме автообнаружения через HTTPS-записи).
utls*OutboundUTLSOptions(unset)OutboundUTLSOptionsИмитация ClientHello через uTLS.
reality*OutboundRealityOptions(unset)OutboundRealityOptionsКлиентская конфигурация REALITY. Взаимоисключима с обычным TLS.

Исходный код: option/tls.go:97-122 · зафиксировано на v1.13.15 (3708fa1)

utls

ПолеТипПо умолчаниюДопустимые значенияОписание
enabledboolfalsetrue | falseВключить uTLS.
fingerprintstringchromechrome | firefox | safari | ios | android | edge | 360 | qq | random | randomizedИмитируемый отпечаток браузера. Определяет весь ClientHello (наборы шифров, расширения, подписи).

Исходный код: option/tls.go:229-232 · зафиксировано на v1.13.15 (3708fa1)

Примеры

Входящий с выпуском сертификата через ACME:

json
{
  "inbounds": [{
    "type": "vless",
    "listen_port": 443,
    "users": [{ "uuid": "..." }],
    "tls": {
      "enabled": true,
      "server_name": "example.com",
      "alpn": ["h2", "http/1.1"],
      "acme": {
        "domain": ["example.com"],
        "email": "admin@example.com"
      }
    }
  }]
}

Исходящий с отпечатком chrome через uTLS и скрытием SNI фрагментацией TCP:

json
{
  "outbounds": [{
    "type": "vless",
    "server": "example.com",
    "server_port": 443,
    "uuid": "...",
    "tls": {
      "enabled": true,
      "server_name": "example.com",
      "utls": { "enabled": true, "fingerprint": "chrome" },
      "fragment": true,
      "fragment_fallback_delay": "500ms"
    }
  }]
}

Взаимный TLS — сервер требует клиентские сертификаты:

json
{
  "inbounds": [{
    "type": "http",
    "listen_port": 8443,
    "tls": {
      "enabled": true,
      "certificate_path": "/etc/ssl/cert.pem",
      "key_path": "/etc/ssl/key.pem",
      "client_authentication": "require-and-verify",
      "client_certificate_path": ["/etc/ssl/clients-ca.pem"]
    }
  }]
}

Примечания

  • Пять значений client_authentication напрямую соответствуют crypto/tls.ClientAuthType в Go:
    • no — без клиентского сертификата (по умолчанию).
    • request — запросить сертификат, но принимать и без него.
    • require-any — требовать, но не проверять.
    • verify-if-given — проверять, если предоставлен.
    • require-and-verify — строгий mTLS.
  • fragment и record_fragment — два разных уровня:
    • fragment разбивает TCP-пакеты, несущие TLS-рукопожатие.
    • record_fragment разбивает сами TLS-записи (записи Handshake отправляются несколькими меньшими частями). Сначала используйте fragment; включайте record_fragment, только если DPI по SNI всё ещё классифицирует соединение.
  • kernel_tx / kernel_rx включают KTLS в Linux для AES-GCM и CHACHA20-POLY1305. В ядре должен быть загружен модуль tls и зарегистрированы нужные криптомодули.
  • acme взаимоисключим с явными certificate/key. С ACME sing-box использует встроенный autocert-клиент — параметры ACME-провайдеров см. в документации апстрима.
  • REALITY (подблок reality) полностью заменяет TLS-рукопожатие — см. REALITY — sing-box.
  • ECH (подблок ech) встраивается в то же рукопожатие — см. ECH — sing-box.

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

  • Xray-core использует streamSettings.tlsSettings, а не встроенный блок tls. Имена полей в camelCase (serverName, cipherSuites). Отпечаток uTLS — поле верхнего уровня, а не подблок. См. TLS — Xray-core.
  • mihomo не имеет единого TLS-блока — каждый адаптер прокси несёт TLS-поля непосредственно в себе (tls, sni, alpn, skip-cert-verify и т. д.). См. TLS — mihomo.

Исходный код: option/tls.go:12-232 · v1.13.15 (3708fa1)

Core Tutorial от Argsment