Skip to content

Поставщики сертификатов — sing-box ​

Поставщики сертификатов получают и продлевают серверные TLS-сертификаты для входящих. Объявите их в массиве верхнего уровня certificate_providers и сошлитесь на один из них в блоке tls входящего через certificate_provider — по тегу или встроенно, объектом с собственным type. Типов три: acme (Let's Encrypt, ZeroSSL или любой УЦ с ACME), cloudflare-origin-ca (сертификаты Cloudflare Origin CA) и tailscale (сертификат узла в tailnet через конечную точку Tailscale). Они заменяют встроенный блок tls.acme, который устарел.

Конверт ​

У каждой записи certificate_providers[] есть type и tag, а также поля её типа на том же уровне:

ПолеТипПо умолчаниюДопустимые значенияОписание
typestring(required)acme | cloudflare-origin-ca | tailscaleТип поставщика; определяет, какой набор полей ниже применяется. Неизвестный тип вызывает ошибку при запуске.
tagstring(unset)<string>Имя, на которое ссылаются поля tls.certificate_provider входящих. Встроенные поставщики его не используют.

Исходный код: option/certificate_provider.go:18-22 · зафиксировано на v1.14.2 (af6e64c)

Входящее использует поставщика через tls.certificate_provider: строка — это тег записи certificate_providers, объект — встроенный поставщик с собственным type. Как это сочетается с certificate / key, встроенным блоком acme и REALITY, см. на странице TLS.

acme ​

ПолеТипПо умолчаниюДопустимые значенияОписание
domainbadoption.Listable[string](required)<domain> | <IP address>Имена, для которых выпускаются сертификаты. IP-адреса допускаются (см. profile).
data_directorystring$XDG_DATA_HOME/certmagic<dir path>Где хранятся данные учётной записи ACME и сертификаты. Запасной вариант — $HOME/.local/share/certmagic.
default_server_namestring(unset)<hostname>Имя сервера для выбора сертификата, когда ClientHello не содержит SNI.
emailstring(unset)<e-mail>E-mail для создания или выбора учётной записи ACME.
providerstringletsencryptletsencrypt | zerossl | <https:// directory URL>Удостоверяющий центр ACME. Для zerossl нужен один из external_account, email или account_key; при email без external_account учётные данные EAB запрашиваются автоматически.
account_keystring(unset)<PEM key>Закрытый ключ PEM существующей учётной записи ACME для повторного использования.
disable_http_challengeboolfalsetrue | falseОтключить проверку HTTP-01.
disable_tls_alpn_challengeboolfalsetrue | falseОтключить проверку TLS-ALPN-01.
alternative_http_portuint1680<port>Порт слушателя проверки HTTP-01 вместо 80; порт 80 всё равно должен вести на него.
alternative_tls_portuint16443<port>Порт слушателя проверки TLS-ALPN-01 вместо 443; система должна перенаправлять 443 на него.
external_account*ACMEExternalAccountOptions(unset){ key_id, mac_key }Привязка внешней учётной записи (EAB): идентификатор ключа и MAC-ключ, выданные УЦ по отдельному каналу.
dns01_challenge*ACMEProviderDNS01ChallengeOptions(unset)ACMEProviderDNS01ChallengeOptionsИспользовать проверку DNS-01 (см. ниже). Если задано, другие типы проверок отключаются.
key_typeACMEKeyType(library default)ed25519 | p256 | p384 | rsa2048 | rsa4096Тип закрытого ключа для новых сертификатов.
profilestring(unset)<ACME profile>Запрашиваемый профиль ACME. С Let's Encrypt shortlived выбирается автоматически, если среди доменов есть IP-адрес.
http_client*HTTPClientOptions(default client)<http_clients tag> | HTTPClientOptionsHTTP-клиент для всех запросов ACME: встроенный объект или тег записи http_clients.

Исходный код: option/acme.go:15-31 · зафиксировано на v1.14.2 (af6e64c)

Проверка DNS-01 ​

dns01_challenge принимает provider с учётными данными этого провайдера и следующие поля настройки:

ПолеТипПо умолчаниюДопустимые значенияОписание
ttlbadoption.Duration(provider default)<duration>TTL временной TXT-записи _acme-challenge.
propagation_delaybadoption.Duration0s<duration>Сколько ждать после создания записи, прежде чем проверять её распространение.
propagation_timeoutbadoption.Duration(library default)<duration> | -1Сколько максимум ждать распространения; -1 отключает проверки распространения.
resolversbadoption.Listable[string](system)<resolver> | …DNS-резолверы для проверок распространения.
override_domainstring(unset)<domain>Записывать запись проверки под этим доменом — для имени _acme-challenge, делегированного в другую зону.

Исходный код: option/acme.go:41-47 · зафиксировано на v1.14.2 (af6e64c)

providerПоля учётных данных
alidnsaccess_key_id, access_key_secret, region_id, security_token (временные учётные данные STS)
cloudflareapi_token, zone_token (необязательный токен с Zone:Read, позволяющий ограничить api_token одной зоной)
acmednsusername, password, subdomain, server_url (сервер ACME-DNS)

cloudflare-origin-ca ​

ПолеТипПо умолчаниюДопустимые значенияОписание
domainbadoption.Listable[string](required)<domain> | *.<domain>Имена хостов, включая wildcard, которые попадут в сертификат.
data_directorystring$XDG_DATA_HOME/certmagic<dir path>Корневой каталог для выпущенного сертификата, закрытого ключа и метаданных. Умолчание такое же, как у поставщика ACME.
api_tokenstring(unset)<token>API-токен Cloudflare с правом Zone / SSL and Certificates / Edit. Требуется ровно один из api_token и origin_ca_key.
origin_ca_keystring(unset)<key>Cloudflare Origin CA Key — альтернативные учётные данные. Несовместим с api_token.
request_typeCloudflareOriginCARequestTypeorigin-rsaorigin-rsa | origin-eccЗапрашиваемый тип ключа: RSA или ECDSA P-256.
requested_validityCloudflareOriginCARequestValidity54757 | 30 | 90 | 365 | 730 | 1095 | 5475Срок действия сертификата в днях (5475 = 15 лет).
http_client*HTTPClientOptions(default client)<http_clients tag> | HTTPClientOptionsHTTP-клиент для запросов к API Cloudflare: встроенный объект или тег записи http_clients.

Исходный код: option/origin_ca.go:12-20 · зафиксировано на v1.14.2 (af6e64c)

tailscale ​

ПолеТипПо умолчаниюДопустимые значенияОписание
endpointstring(required)<endpoint tag>Тег конечной точки Tailscale, чей сертификат узла (для его имени *.ts.net) отдаётся. В консоли администратора Tailscale должны быть включены MagicDNS и HTTPS.

Исходный код: option/tailscale.go:78-80 · зафиксировано на v1.14.2 (af6e64c)

Примеры ​

Общий поставщик ACME с проверкой DNS-01 через Cloudflare, на который ссылаются по тегу:

json
{
  "certificate_providers": [
    {
      "type": "acme",
      "tag": "le",
      "domain": ["example.com"],
      "email": "admin@example.com",
      "dns01_challenge": {
        "provider": "cloudflare",
        "api_token": "<cloudflare-api-token>"
      }
    }
  ],
  "inbounds": [
    {
      "type": "trojan",
      "tag": "trojan-in",
      "listen": "::",
      "listen_port": 443,
      "users": [{ "name": "user", "password": "<password>" }],
      "tls": {
        "enabled": true,
        "certificate_provider": "le"
      }
    }
  ]
}

Сертификат tailnet конечной точки Tailscale; входящее затем задаёт "certificate_provider": "ts-cert":

json
{
  "endpoints": [
    { "type": "tailscale", "tag": "ts-ep", "auth_key": "tskey-auth-xxxxxxxxxxxx" }
  ],
  "certificate_providers": [
    { "type": "tailscale", "tag": "ts-cert", "endpoint": "ts-ep" }
  ]
}

Переход со встроенного tls.acme ​

Перенесите поля tls.acme без изменений в tls.certificate_provider, добавив "type": "acme" (или в запись certificate_providers, на которую ссылаются по тегу):

json
// до (устарело)
"tls": { "enabled": true, "acme": { "domain": ["example.com"], "email": "admin@example.com" } }

// после
"tls": { "enabled": true, "certificate_provider": { "type": "acme", "domain": ["example.com"], "email": "admin@example.com" } }

Примечания ​

  • Теги сборки: acme требует with_acme, tailscale — with_tailscale; без них тип существует, но запуск завершается ошибкой. cloudflare-origin-ca компилируется всегда.
  • На поставщика с тегом могут ссылаться несколько входящих.
  • Сертификатам Cloudflare Origin CA доверяет только сама граница Cloudflare. Используйте их на серверах-источниках за прокси Cloudflare, а не для клиентов, подключающихся напрямую. Поставщик автоматически продлевает их до истечения срока.
  • Поставщик tailscale завершает запуск ошибкой, если endpoint пуст, не найден или не является конечной точкой Tailscale.
  • Поля ACME совпадают с устаревшим встроенным блоком tls.acme, плюс account_key, key_type, profile и http_client.

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

  • У Xray-core нет встроенного ACME или поставщиков сертификатов: серверные сертификаты берутся из файлов или встроенного PEM в tlsSettings.certificates. См. TLS — Xray-core.
  • У mihomo их тоже нет: слушатели принимают сертификат и закрытый ключ напрямую. См. Обзор TLS — mihomo.

Исходный код: option/certificate_provider.go:18-69 · v1.14.2 (af6e64c)

Core Tutorial от Argsment