SNI - технология установки нескольких SSL сертификатов на один IP

Как правило, на одном IP адресе можно установить только один SSL сертификат. Когда администратор веб-сайта ограничен в использовании одного сертификата SSL на сокет (комбинация IP адреса и сокета), это может стоить для компании больших затрат, так как данное ограничение заставляет их покупать несколько IP адресов у доменного хоста или оборудование, позволяющее использовать несколько сетевых адаптеров.

Одним из вариантов решения этой проблемы являются мультидоменные SSL сертификаты, в которые может входить до 100 доменов. Благодаря удобству использования и быстроте обслуживания, такие сертификаты стоят несколько дороже обычных. Поэтому возникла необходимость поиска иного способа решения этой проблемы.


На сегодняшний день благодаря технологии Server Name Identification (или сокращенно SNI) появилась возможность установить несколько цифровых SSL сертификатов безопасности на одном IP адресе. В этой статье мы рассмотрим следующие вопросы:

  • что собой представляет SNI,
  • как работает эта технология
  • как настроить SNI
  • какие браузеры и операционные систему поддерживают SNI
  • и какие недостатки имеет эта технология

Что такое SNI?

Индикация имени сервера (SNI или Server Name Indication) – это расширение TLS протокола, которое указывает к какому хосту пытается подключиться клиент в начале процесса квитирования (установки соединения). Соответственно это позволяет серверу с самого начала определить корректное имя виртуального хоста для запроса и установки защищенного соединения. С помощью SNI, вы можете иметь несколько доменов, привязанных к одному и тому же IP-адресу и порту, и на каждом из этих доменных имен Вы можете установить отдельный SSL сертификат. SSL SNI

Суть проблемы

При выполнении TLS соединения клиент запрашивает цифровой SSL сертификат с веб-сервера; как только сервер отправляет сертификат, клиент рассматривает его и сравнивает имя, которое отправило запрос на подключение, с именем или именами, включенными в сертификат. Если совпадение найдено, соединение продолжается как обычно. Если же совпадений нет, браузер предупреждает пользователя о данном несоответствии, после чего связь может быть прервана. Тем не менее, некоторые приложения позволяют пользователю обойти предупреждение, приступив к подключению с пользователем, принимающим на себя ответственность за достоверность SSL сертификата и, как следствие, соединения. И хотя в современном SSL сертификате можно указать несколько доменных имен и просто использовать этот сертификат в виртуальном хосте по умолчанию, имеется много хостинг провайдеров, которые обслуживают слишком много веб-сайтов на одном адресе для большей практичности, что делает защиту отдельных доменов невозможной.

Каким образом SNI устраняет проблему?

Расширение SNI решает данную проблему путем отправления имени виртуального домена в рамках TLS переговоров. Это позволяет серверу заранее выбрать правильный виртуальный домен и представить браузеру сертификат, содержащий корректное имя. Поэтому с клиентами и серверами, которые поддерживают SNI, один IP адрес может быть использован для обслуживания группы доменных имен, для которых нецелесообразно получить общий SSL сертификат.

Системные требования

  • OpenSSL 0.9.8f и выше с опцией поддержки TLS Extensions (опция Enable-tlsext; OpenSSL 0.9.8k и позже имеет это включение по умолчанию).
  • Apache, сконфигурированный с этим OpenSSL (./configure --with-SSL = / путь / к / вашей / OpenSSL). В этом случае, mod_ssl автоматически обнаружит наличие расширений TLS и будет поддерживать SNI.
  • Установленная библиотека LD_LIBRARY_PATH или эквивалент, чтобы указать на библиотеку OpenSSL, если Apache при запуске не может найти ее (bin / envvars).

Как узнать, поддерживает ли Ваш Apache SNI?

Если настроить несколько имен на основе виртуальных хостов для адреса, где настроен SSL, и SNI не встроено в Apache, то после запуска Apache Вы получите в журнале ошибок сообщение:

«You should not use name-based virtual hosts in conjunction with SSL!!»(«Вы не должны использовать виртуальные хосты, основанные на имени, в сочетании с SSL!!»).

Если расширение SNI встроено, то журнал ошибок покажет:

«[warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)» («[предупреждение] Виртуальные хосты, основанные на имени, с SSL работают только для клиентов с поддержкой TLS SNI (RFC 4366)».

Браузеры, поддерживающие SNI

Браузеры ПК:

  • Internet Explorer 7 либо более поздние версии
  • Firefox 2
  • Opera 8 c TLS 1.1
  • Google Chrome:
  • Поддерживается на Windows XP, на Chrome 6 и более поздних версиях
  • Поддерживается на Vista и поздних версиях по умолчанию
  • OS X 10.5.7 в Chrome версии 5.0.342.0 и выше
  • Safari 2.1 и поздние версии (требует OS X 10.5.6 и выше или Windows Vista и выше).
Примечание: Ни одна из версий Internet Explorer под Windows XP не поддерживает SNI

Мобильные браузеры:

  • Мобильная версия Safari для iOS 4.0
  • Android 3.0 (Honeycomb) и более поздние версии
  • Windows Phone 7
Если Apache поддерживает SNI, в случае получения запроса по протоколу SSL без имени хоста SNI для виртуального хоста, основанного на имени, и SSLStrictSNIVHostCheck включен, он будет отклонен (403), и появится следующее сообщение:

No hostname was provided via SNI for a name based virtual host (т.е. имени хоста для данного SNI не было найдено)

Если SSLStrictSNIVHostCheck выключен, то запрос будет обрабатываться, как если бы сервер не имел поддержки SNI.

Пример настроек сервера:

# Убедитесь, что Apache слушает порт 443 Listen 443 # Прослушайте запросы виртуального хоста на всех IP адресах NameVirtualHost *:443 # Далее установите соединение для этих виртуальных хостов # для всех клиентов без SNI SSLStrictSNIVHostCheck off <VirtualHost *:443> # Так как этот виртуальный хост определяется первым, он будет # использоваться по умолчанию, если не будет получено имя хоста # во время рукопожатия SSL, то есть если браузер не поддерживает # SNI. DocumentRoot /www/example-domain-1 ServerName www.example-domain-1.ru # Другие команды здесь </VirtualHost> <VirtualHost *:443> DocumentRoot /www/example-domain-2 ServerName www.example-domain-2.com # Другие команды здесь </VirtualHost>

Возврат к списку

5 шагов к безопасному сайту с SSL
Заказать SSL сертификат
Создать CSR запрос
Пройти валидацию
Получить SSL сертификат
Установить SSL сертификат
EV SSL Certificate