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 ГБ

Реєстрація за хвилину, доступи одразу після оплати.

Створити акаунт