Ответ
SNI (Server Name Indication) — это критически важное расширение протокола TLS, которое позволяет клиенту (браузеру, curl) указать имя хоста (домен), к которому он подключается, ещё на этапе рукопожатия (handshake), до предъявления сертификата сервером.
Проблема, которую решает SNI: Без SNI, если на одном IP-адресе и порту (например, 203.0.113.1:443) размещены несколько HTTPS-сайтов (site-a.com, site-b.com), сервер не сможет понять, какой именно сертификат (с каким Common Name) нужно отправить клиенту. Это приводило бы к ошибкам или необходимости выделять отдельный IP на каждый домен.
Как это выглядит на практике:
# Проверка поддержки SNI сервером example.com
openssl s_client -connect example.com:443 -servername example.com
# Ключевой параметр -servername передаёт имя хоста в расширении SNI
Значение для DevOps и администрирования:
- Виртуальные хосты на HTTPS: Позволяет экономить публичные IPv4-адреса, размещая множество доменов на одном IP.
- Сертификаты Let's Encrypt: Современные клиенты (Certbot, Traefik) используют SNI для прохождения challenge
TLS-ALPN-01при автоматическом получении сертификатов. - Балансировщики нагрузки (AWS ALB, Nginx, HAProxy): Используют SNI для маршрутизации TLS-трафика на разные бэкенд-группы на основе имени хоста.
Важное ограничение: SNI передаётся в открытом виде (незашифрованно) в ClientHello, что имеет значение для конфиденциальности. Это решается протоколом ESNI (Encrypted SNI) или его преемником ECH (Encrypted Client Hello).