TLS — sing-box
Каждый входящий и исходящий sing-box встраивает блок tls: { ... } через InboundTLSOptionsContainer / OutboundTLSOptionsContainer. Тот же блок содержит подблоки REALITY, ECH и uTLS как вложенные параметры — это не отдельные функции верхнего уровня.
Входящий tls
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
enabled | bool | false | true | false | Главный переключатель. При false остальная часть блока игнорируется. |
server_name | string | (inferred from SNI) | <hostname> | Ожидаемое имя сервера для выпуска сертификата через ACME. Обязательно, если задан `acme`. |
insecure | bool | false | true | false | Пропустить проверку TLS. Только для тестов. |
alpn | badoption.Listable[string] | [] | <ALPN string> | Список ALPN, предлагаемый клиентам. |
min_version | string | 1.2 | 1.0 | 1.1 | 1.2 | 1.3 | Минимально допустимая версия TLS. |
max_version | string | 1.3 | 1.0 | 1.1 | 1.2 | 1.3 | Максимально допустимая версия TLS. |
cipher_suites | badoption.Listable[string] | (library default) | <cipher> | Переопределить список наборов шифров (только TLS 1.2). |
curve_preferences | badoption.Listable[CurvePreference] | (library default) | P256 | P384 | P521 | X25519 | X25519MLKEM768 | Список предпочитаемых кривых для обмена ключами. |
certificate | badoption.Listable[string] | [] | <PEM block> | Встроенный PEM-сертификат сервера. Форма списка поддерживает полную цепочку. |
certificate_path | string | (unset) | <PEM file path> | Путь к сертификату сервера. |
client_authentication | ClientAuthType | no | no | request | require-any | verify-if-given | require-and-verify | Политика клиентской аутентификации mTLS. Соответствует значениям ClientAuthType из crypto/tls. |
client_certificate | badoption.Listable[string] | [] | <PEM block> | Доверенные корневые сертификаты клиентов (mTLS). |
client_certificate_path | badoption.Listable[string] | [] | <PEM file path> | Доверенные корневые сертификаты клиентов в виде путей. |
client_certificate_public_key_sha256 | badoption.Listable[[]byte] | [] | <SHA-256 bytes> | Закрепить клиентский сертификат по SHA-256 открытого ключа. Полезно при выпуске одноразовых клиентских сертификатов. |
key | badoption.Listable[string] | [] | <PEM block> | Встроенный приватный ключ сервера. |
key_path | string | (unset) | <file path> | Путь к приватному ключу сервера. |
kernel_tx | bool | false | true | false | KTLS в Linux — переложить TLS-шифрование исходящего трафика на ядро. Требует поддержки TLS в ядре и нужных криптомодулей. |
kernel_rx | bool | false | true | false | KTLS в 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
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
enabled | bool | false | true | false | Главный переключатель. |
disable_sni | bool | false | true | false | Полностью убрать расширение SNI из ClientHello. |
server_name | string | (server address) | <hostname> | SNI, отправляемый серверу, и имя, сверяемое с конечным (leaf) сертификатом. |
insecure | bool | false | true | false | Пропустить проверку сертификата сервера. |
alpn | badoption.Listable[string] | [] | <ALPN string> | Список ALPN, предлагаемый серверу. |
min_version | string | 1.2 | 1.0 | 1.1 | 1.2 | 1.3 | Минимально допустимая версия TLS. |
max_version | string | 1.3 | 1.0 | 1.1 | 1.2 | 1.3 | Максимально допустимая версия TLS. |
cipher_suites | badoption.Listable[string] | (library default) | <cipher> | Переопределить список наборов шифров. |
curve_preferences | badoption.Listable[CurvePreference] | (library default) | <see inbound> | Предпочтения кривых для обмена ключами. |
certificate | badoption.Listable[string] | [] | <PEM block> | Доверенные сертификаты ЦС, добавляемые к системному корневому хранилищу. Используйте с `insecure: false` для серверов с самоподписанными сертификатами. |
certificate_path | string | (unset) | <file path> | Доверенные ЦС в виде пути. |
certificate_public_key_sha256 | badoption.Listable[[]byte] | [] | <SHA-256 bytes> | Закрепить сертификат сервера по SHA-256 открытого ключа. |
client_certificate | badoption.Listable[string] | [] | <PEM block> | Клиентский сертификат (mTLS). |
client_certificate_path | string | (unset) | <file path> | Клиентский сертификат в виде пути. |
client_key | badoption.Listable[string] | [] | <PEM block> | Приватный ключ клиента. |
client_key_path | string | (unset) | <file path> | Приватный ключ клиента в виде пути. |
fragment | bool | false | true | false | Фрагментация рукопожатия на уровне TCP. Разбивает ClientHello по пакетам, чтобы обойти DPI, работающий по SNI. |
fragment_fallback_delay | badoption.Duration | 500ms | <duration> | Если фрагментированное рукопожатие не завершилось за это время, повторить попытку без фрагментации. |
record_fragment | bool | false | true | false | Фрагментация на уровне TLS-записей (агрессивнее `fragment` — разбивает сам поток TLS-записей, а не только TCP-пакеты). |
kernel_tx | bool | false | true | false | KTLS в Linux для исходящего трафика. |
kernel_rx | bool | false | true | false | KTLS в 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
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
enabled | bool | false | true | false | Включить uTLS. |
fingerprint | string | chrome | chrome | 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)
