SNI

SNI — поле в начале HTTPS-соединения, в котором программа сообщает имя сайта, к которому подключается.

Обновлено · Редакция Prokso

На одном IP-адресе сервера могут работать сотни сайтов. Чтобы сервер знал, какой сертификат показать, программа ещё до шифрования передаёт имя сайта — это и есть SNI.

Поле SNI обычно не зашифровано. Поэтому даже без доступа к содержимому сеть и прокси видят, на какой сайт вы идёте, — но не адреса страниц и не данные.

Именно так прокси-сервис может вести учёт доменов, не зная, что происходит внутри соединения. Подробнее о шифровании — в статье TLS.

В Prokso содержимое и адреса страниц, пароли не сохраняются; для рассмотрения жалоб хранятся только домены, время и объём — 90 дней.

Где именно в соединении находится SNI

SNI — это расширение сообщения ClientHello, первого пакета рукопожатия TLS. Поле называется server_name и содержит имя хоста, например example.com, без пути и без порта. Сервер читает его и выбирает сертификат еще до того, как согласованы ключи.

Через HTTP-прокси имя сайта появляется дважды: сначала в строке CONNECT example.com:443 для туннеля, затем в SNI внутри туннеля. Прокси читает только первое, второе идет к сайту как есть. Обычно оба имени совпадают.

Почему соединение по IP-адресу ломает HTTPS

Стандарт разрешает в SNI только имя хоста, а не IP-адрес. Если программа открывает https://203.0.113.10/, она не отправляет имени, и сервер со многими сайтами возвращает сертификат по умолчанию. Результат — ошибка несоответствия имени, хотя сам сайт работает. Поэтому в настройках программ и скриптов указывайте имя сайта, а не его IP.

Когда нужно попасть на конкретный адрес сервера, сохранив имя, используйте curl --resolve example.com:443:203.0.113.10 https://example.com/. curl соединится с указанным адресом, но отправит example.com в SNI и в заголовке Host.

Как увидеть, какой сертификат возвращает имя

Команда openssl s_client -connect example.com:443 -servername example.com явно задает значение SNI и выводит сертификат, который выбрал сервер. Сравните имена в сертификате с именем сайта: оно должно быть в поле subject или в списке альтернативных имен. Шаблон *.example.com покрывает shop.example.com, но не сам example.com и не a.shop.example.com. Если неправильный сертификат появляется только при работе через прокси, откройте страницу ошибки сертификата.

Вопросы и ответы

Можно ли скрыть SNI?

Новый стандарт ECH шифрует это поле, но его поддерживают далеко не все сайты и браузеры.

Что видит прокси в HTTPS-соединении?

Имя сайта, время и объём данных. Адреса страниц и содержимое остаются зашифрованными.

Резидентские $1.59, мобильные $2.50, серверные $0.65 за 1 ГБ

Регистрация за минуту, доступы сразу после оплаты.

Создать аккаунт