Что такое SNI (Server Name Indication)
SNI (Server Name Indication) — это ключевая функция в протоколе TLS, которая избавляет от необходимости выделять отдельный IP-адрес для каждого домена. Благодаря ей один сервер может одновременно обслуживать несколько SSL/TLS-сертификатов, просто получая информацию о домене заранее и выбирая нужный сертификат. Это значительно упрощает конфигурацию и снижает расходы на инфраструктуру, поскольку теперь можно безопасно хостить сразу несколько сайтов на одном IP-адресе.
Как это работает
1. Проблема без SNI
Когда клиент (например, браузер) подключается к серверу через HTTPS, он сначала устанавливает TLS-соединение. Без SNI сервер не знает, какой именно домен клиент запрашивает, потому что доменное имя передаётся в HTTP-запросе уже после установки защищённого соединения. В результате сервер может использовать только один SSL/TLS-сертификат для всех своих доменов.
2. Решение с SNI
SNI добавляет доменное имя в начальное сообщение клиента при установлении TLS-соединения (в рамках этапа «handshake»). Это позволяет серверу заранее узнать, для какого домена необходимо установить защищённое соединение и какой сертификат для этого использовать.
Преимущества SNI
- Экономия ресурсов
Один сервер может обслуживать несколько доменов с разными сертификатами без необходимости выделять уникальный IP-адрес для каждого домена. - Поддержка виртуального хостинга
Благодаря возможности использовать разные сертификаты на одном IP-адресе, SNI получил широкое распространение в облачных и хостинговых сервисах. - Удобство управления
Можно легко добавлять или изменять сертификаты для отдельных доменов без необходимости масштабных изменений на уровне инфраструктуры.
Ограничения
- Старые устройства
SNI не поддерживается на очень старых клиентах и серверах (например, Internet Explorer на Windows XP или в старых версиях OpenSSL). - Шифрование имени домена
Имя домена передаётся открытым текстом во время TLS Handshake, что может быть проблемой для конфиденциальности. Решение — использование таких технологий, как Encrypted Client Hello (ECH).
Поддержка
Современные браузеры и серверы широко поддерживают SNI, что сделало эту технологию стандартом в индустрии. Большинство приложений (например, Apache, Nginx, Dovecot или Postfix) и библиотек для работы с TLS уже давно имеют поддержку SNI.
Пример настройки SNI в Nginx
Ниже приведён упрощённый пример конфигурации Nginx. Данный пример использует два виртуальных хоста, каждый из которых имеет свой сертификат:
server {
listen 443 ssl http2;
server_name example1.com;
ssl_certificate /etc/ssl/certs/example1.crt;
ssl_certificate_key /etc/ssl/private/example1.key;
}
server {
listen 443 ssl http2;
server_name example2.com;
ssl_certificate /etc/ssl/certs/example2.crt;
ssl_certificate_key /etc/ssl/private/example2.key;
}
Оба виртуальных хоста «слушают» один и тот же порт (443), но при этом настроены на разные имена серверов (example1.com
и example2.com
).
Благодаря SNI веб-сервер понимает, к какому сертификату нужно обращаться при установке HTTPS-соединения для каждого домена.