Блог "Дети ОИТа"
/поиск

TLS Server Name Indication (SNI) на практике: совместимость, безопасность и диагностика

Глубокое погружение в SNI: как работает, проблемы совместимости, безопасность, диагностика и перспективы с ECH в TLS 1.3.

Введение

SNI (Server Name Indication) — расширение TLS, позволяющее клиенту указать имя хоста в ClientHello до установки шифрованного канала. Это основа современного HTTPS-хостинга: один IP, множество сертификатов. Однако SNI порождает вопросы совместимости со старым ПО, утечки приватности и сложности диагностики.

Как работает SNI

  • Клиент отправляет server_name в незашифрованном ClientHello.
  • Сервер выбирает сертификат и цепочку по этому имени.
  • После TLS handshake устанавливается защищённый канал.

Совместимость

  • Современные браузеры и клиенты: полная поддержка SNI (TLS 1.0+).
  • Устаревшие системы (Windows XP, старые Java): не поддерживают SNI — получают default-сертификат.
  • TLS 1.3 + ECH (Encrypted Client Hello): SNI шифруется решая проблему приватности.

Безопасность и приватность

  • SNI утекает имя хоста в открытом виде на уровне TCP/TLS.
  • Провайдеры и промежуточные узлы видят, к каким сайтам обращается клиент.
  • ECH (Encrypted Client Hello) в TLS 1.3 — решение, но требует поддержки на клиенте и сервере (Cloudflare, Firefox, Chrome).

Практическая настройка

Nginx

server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
}

server {
    listen 443 ssl http2;
    server_name api.example.com;
    ssl_certificate /etc/ssl/certs/api.example.com.crt;
    ssl_certificate_key /etc/ssl/private/api.example.key;
}

HAProxy

frontend https-in
    bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
    use_backend %[req_ssl_sni,lower,map(/etc/haproxy/sni.map)]

Диагностика

# Проверка SNI через OpenSSL
openssl s_client -connect example.com:443 -servername example.com -tlsextdebug

# Проверка через curl
curl -v --resolve example.com:443:1.2.3.4 https://example.com

# Проверка ECH (если поддерживается)
curl -v --http3 https://cloudflare-ech.com

Типичные проблемы

  • Wrong certificate: default-сертификат вместо ожидаемого — проверьте server_name и порядок блоков server.
  • SNI не передаётся: старые клиенты, прокси или библиотеки — обновите ПО.
  • ECH блокируется: middlebox или корпоративный прокси — временно отключите ECH для диагностики.

Хештеги

#TLS #SNI #ECH #HTTPS #Nginx #HAProxy #безопасность #диагностика #совместимость

Заключение

SNI — фундамент современного HTTPS-мульти-хостинга. Понимание его ограничений, совместимости и новых расширений (ECH) критично для администраторов и DevOps. Регулярно проверяйте конфигурацию сертификатов и следите за поддержкой ECH в вашей инфраструктуре.