В современном мире интернет-технологий, где один сервер часто обслуживает множество доменов, возникает вопрос эффективного управления безопасными соединениями. Здесь на помощь приходит SNI (Server Name Indication) — ключевое расширение протокола TLS (Transport Layer Security).
SNI позволяет клиенту указывать имя хоста (доменное имя), к которому он стремится подключиться, уже на этапе начала TLS рукопожатия.
В этом руководстве мы разберем, как SNI функционирует в контексте HTTPS.
Введение в SNI: Как решаются проблемы множественных доменов на одном IP
SNI (Server Name Indication) — это расширение протокола TLS (Transport Layer Security), которое позволяет клиенту указать имя хоста (доменное имя), к которому он пытается получить доступ у сервера, на этапе начала TLS рукопожатия.
SNI был введен в стандарт TLS начиная с версии 1.0
Это было необходимо в средах, где один физический или виртуальный сервер обслуживает несколько доменов (виртуальные хосты) на одном IP-адресе.
Представим что у нас есть хостинг и на одном IP крутятся 100 сайтов.
При отправке HTTPS запроса на сайт, серверу Nginx (для примера) нужно понять какой сертификат выдать клиенту для установления зашифрованного соединения.
Для этого Nginx сопостает отправленное ему доменное имя и server_name в конфиге.
Но сервер не знает запрашиваемый Host
(доменное имя) а нам как-то нужно получить правильные сертификаты для конкретного сайта из 100 других.
Доменное имя вводимое в браузерной строке при запросе на сервер будет сконвертировано в IP адрес по DNS записи на вашем устройстве (ПК, смартфон).
А на этапе HTTPS Handshake —Host
заголовок и весь HTTP-трафик включая методы отправки (GET/POST/etc) не оправляются.
Первоначальным решением этой проблемы было иметь выделенный IP адрес для каждого сайта/сервиса и выдавать 1 сертификат. Но этот подход был невыгоден кастомерам и хостинговым компаниям и https не получил бы такого распространения.
На помощь пришел SNI
Без SNI сервер не знает, какой сертификат предъявить до того, как будет установлено зашифрованное соединение. До HTTPS информация о запрашиваемом домене традиционно передавалась только в HTTP заголовках, которые шли уже после установления зашифрованного соединения.
SNI решает эту проблему, позволяя клиенту указать запрашиваемый домен уже в ClientHello
сообщении (при рукопожатии в TLS).
Как работает SNI в HTTPS
Пример (упрощенный) того, как клиент отправляет SNI во время TLS рукопожатия:
- ClientHello: Клиент начинает рукопожатие, отправляя
ClientHello
сообщение.
Оно включает в себя:- список поддерживаемых шифров версий TLS
- в случае использования SNI, имя хоста (доменное имя), к которому клиент пытается подключиться.
- ServerHello: Сервер получает
ClientHello
и используя информацию SNI, определяет, какой сертификат следует использовать для данного домена.
Сервер продолжает рукопожатие, отправляяServerHello
, сертификат и другие необходимые сообщения. - Certificate Check: Проверка сертификата сервера.
- Key Exchange: Обмена ключами шифрования.
- Data Transmission: Передача заголовков (Host, Method, etc) и Body в зашифрованном виде от клиента -> серверу.
Более детально про работу HTTPS.
Когда SNI не используется
- Старые клиенты или серверы.
Некоторые старые браузеры или приложения которые не поддерживают TLS 1.0 и могут не поддерживать SNI.
Примеры: Internet Explorer на Windows XP и некоторые старые версии других браузеров. Если клиент или сервер не поддерживает SNI, то не возможно использовать один IP-адрес для обслуживания нескольких доменов с различными SSL/TLS сертификатами. Проблемы с конфиденциальностью.
Поскольку SNI передает имя хоста в незашифрованном виде во время TLS-рукопожатия, это может создать проблемы с конфиденциальностью в определенных сценариях. В таких случаях организации могут выбрать альтернативные методы для обеспечения безопасности своих соединений.
Теперь эта проблема не актуальна, т.к. с версии TLS 1.3 используется ESNI (Encrypted SNI)
Ключевые выводы о SNI в HTTPS
Соотстветственно — использование SNI позволяет серверу предоставить соответствующий сертификат для каждого домена, обслуживаемого на одном IP-адресе, и обеспечивает безопасное соединение с правильной идентификацией сервера.
По ссылкам ниже можете прочитать про защищенный SNI — ESNI, и новую версию ECH.
Полезные ссылки
- Server_Name_Indication
- Server Name Indication (SNI): Используем несколько SSL Сертификатов на одном IP
- До свидания, ESNI, привет ECH
- Good-bye ESNI, hello ECH!
- Efficiently Bypassing SNI-based HTTPS Filtering
- How ECH works
- ESNI как защита TLS от утечек метаинформации
- SNI: виртуальный хостинг для HTTPS