SNI (Server Name Indication) — расширение протокола TLS, определённое в RFC 6066. При TLS Handshake клиент включает в сообщение Client Hello поле с именем целевого хоста. Сервер читает это имя до расшифровки и выбирает соответствующий SSL/TLS-сертификат.
Как работает
До SNI сервер не знал, какой виртуальный хост запрашивает клиент в момент TLS Handshake — HTTP-заголовок Host приходит только после установки соединения. Это означало: один IP-адрес = один сертификат. SNI решает проблему: клиент сообщает имя хоста в открытом виде в Client Hello, сервер выбирает нужный сертификат.
В Nginx SNI работает автоматически при настройке нескольких server-блоков с директивой ssl_certificate. Nginx читает SNI из TLS Handshake и выбирает соответствующий конфиг. Аналогично работает Apache mod_ssl и HAProxy.
Ограничение SNI: поле server_name в Client Hello передаётся в открытом тексте и видно пассивному наблюдателю сети. Это раскрывает, какой сайт посещает пользователь, даже без перехвата трафика. Протокол Encrypted Client Hello (ECH, бывший ESNI) шифрует это поле и разрабатывается IETF как решение.
История
SNI предложен в 2003 году (RFC 3546), обновлён RFC 4366 (2006) и RFC 6066 (2011). Первые браузеры получили поддержку SNI: Firefox 2.0 (2006), Opera 8.0 (2005), Safari 2.1 (2008), Internet Explorer 7 (2006). В 2022 году поддержку SNI можно считать универсальной — исключение только очень старые системы (Windows XP IE8 без SNI, Android 2.x).
Связь с хостингом
SNI — основа виртуального хостинга для HTTPS. Без SNI каждый HTTPS-сайт требовал отдельного IP-адреса. С SNI один VPS с одним IP может обслуживать тысячи HTTPS-сайтов. Все современные хостинг-панели (cPanel, ISPmanager, Plesk) используют SNI при добавлении SSL к виртуальным хостам. Let's Encrypt HTTP-01 challenge не требует дополнительных IP благодаря SNI.
Как работает SNI
SNI (Server Name Indication) — расширение TLS (RFC 6066). Клиент в первом сообщении ClientHello указывает имя домена. Сервер выбирает соответствующий SSL-сертификат. Без SNI — на одном IP только один SSL-сертификат. С SNI — сотни сайтов на одном IP.
Поддержка SNI
SNI поддерживают все современные браузеры и ОС (Windows XP не поддерживает). Nginx: SNI работает по умолчанию при наличии нескольких ssl-сертификатов в разных vhost. В Apache: SSLStrictSNIVHostCheck off для старых клиентов.
SNI и виртуальный хостинг
SNI сделал возможным HTTPS-виртуальный хостинг (shared hosting с SSL). До SNI для HTTPS требовался отдельный IP-адрес. Теперь тысячи сайтов разделяют один IP с разными SSL-сертификатами. Encrypted Client Hello (ECH) — эволюция SNI: шифрует сам hostname для privacy.
Encrypted Client Hello (ECH)
ECH (RFC-draft, 2024) — следующий шаг после SNI: шифрует hostname в ClientHello с помощью публичного ключа сервера, полученного через DNS (HTTPS record). Cloudflare реализует ECH. Без ECH: ISP видит домен в SNI даже при HTTPS. С ECH: только зашифрованный innerClientHello.
SNI в облачных балансировщиках
AWS ALB, Azure Application Gateway, Yandex Application Load Balancer — поддерживают SNI для нескольких SSL-сертификатов. Один балансировщик обслуживает десятки доменов с разными сертификатами. Хранение сертификатов в AWS Certificate Manager или Azure Key Vault — ротация без перезапуска.