SNI — небольшая часть TLS, без которой современный интернет выглядел бы гораздо неудобнее. Благодаря SNI на одном IP могут нормально работать множество HTTPS-сайтов с разными сертификатами.
Проблема до SNI
Представьте один сервер:
203.0.113.25
На нём работают:
site-a.ru
site-b.ru
site-c.ru
У каждого свой TLS-сертификат.
Когда начинается TLS, HTTP ещё нет
Серверу нужно выбрать сертификат до того, как он увидит обычный HTTP Host header.
Для этого и существует SNI
SNI означает Server Name Indication.
Клиент во время TLS-handshake сообщает имя сервера, к которому хочет подключиться.
Упрощённо
Клиент:
хочу site-b.ru
Сервер:
тогда вот сертификат site-b.ru
Что происходит без SNI
Сервер может показать default certificate.
Если он выпущен для другого сайта, появится ошибка hostname mismatch.
Почему openssl нужно запускать с -servername
Неправильная проверка:
openssl s_client -connect site-b.ru:443
Более правильная для обычного виртуального HTTPS-хостинга:
openssl s_client \
-connect site-b.ru:443 \
-servername site-b.ru
SNI и IP-адрес
Когда вы открываете HTTPS прямо по IP, нормального доменного SNI может не быть. Поэтому сервер показывает не тот сертификат, который вы ожидали.
Это не означает, что сайт сломан
HTTPS-сайт нужно проверять с его настоящим hostname.
curl --resolve
curl --resolve site-b.ru:443:203.0.113.25 \
https://site-b.ru/
Команда подключится к заданному IP, но сохранит правильное доменное имя и SNI.
SNI при миграции
Это один из лучших способов проверить новый сервер до смены DNS.
Nginx и server_name
На стороне веб-сервера тоже должна быть правильная конфигурация virtual host.
SNI сообщает имя, но сервер ещё должен знать, какой certificate и конфигурацию ему сопоставить.
SNI и CDN
CDN также обслуживает огромное количество доменов на общей инфраструктуре, поэтому выбор сертификата по имени является обычной частью работы HTTPS.
Старые клиенты
Совсем старые реализации TLS могли не поддерживать SNI. Сегодня для обычного современного веба это уже редкость.
SNI шифруется?
Исторически имя в ClientHello могло быть видно наблюдателю сети. Для улучшения конфиденциальности развивается ECH — Encrypted ClientHello.
SNI и DNS — разные вещи
DNS отвечает, куда подключаться.
SNI сообщает серверу, к какому имени пользователь пытается обратиться.
Как NexIP помогает
SSL-проверка обязательно должна использовать корректный SNI, иначе результат для shared hosting может быть ложным.
FAQ
Можно несколько HTTPS-сайтов на одном IP?
Да. Это совершенно стандартная схема.
Почему по IP показывается чужой сертификат?
Скорее всего сервер выбрал default virtual host из-за отсутствия нужного hostname/SNI.
SNI относится к HTTP?
Нет, он передаётся на уровне TLS до обычного HTTP-запроса.
Диагностика NexIP
Продолжите реальной проверкой
Откройте полный раздел диагностики и проверьте сайт, домен или сетевые параметры.
Читайте дальше
Материалы по теме
Как узнать срок действия SSL-сертификата
Как проверить срок SSL/TLS-сертификата: notBefore, notAfter, OpenSSL, curl, ACME, автоматическое продление и мониторинг истечения.
ЧитатьЧто такое SSL-сертификат
Полное руководство по SSL/TLS: как работает HTTPS, сертификаты, SAN, wildcard, цепочка доверия, SNI, OpenSSL и диагностика через NexIP.
ЧитатьПочему браузер пишет «Подключение не защищено»
Сообщение «Подключение не защищено» не обязательно означает, что сайт заражён или вас прямо сейчас взламывают. Оно означает, что браузер не смог нормально подтвердить защищённость HTTPS-соединения. Причин несколько — от банально…
ЧитатьСертификат SSL не соответствует домену: почему так бывает
Ошибка «сертификат не соответствует имени сайта» означает буквально то, что написано: браузер подключился к серверу, получил сертификат, но не нашёл в нём домен, который пользователь открыл. Простой пример Открываем: api.example.com а…
Читать