Індикація імені сервера (англ.Server Name Indication,SNI) — розширення протоколуTLS[1], що надає можливість клієнтському комп'ютеру зазначати на початку процесу «рукотискання» (англ.handshaking), до якого іменіхосту ініціюється з'єднання.Це дозволяє серверові видавати більше ніж один публічнийсертифікат при використанні лише однієїIP-адреси іTCP порту, і таким чином надає можливість організації множиннихHTTPS-сайтів (або інших послуг через протокол TLS) на одній IP-адресі, кожен зі своїм сертифікатом.SNI концептуально еквівалентний механізмовівіртуального хостингу у HTTP/1.1.Ім'я хосту передається у незашифрованому вигляді, так що при перехопленні мережного потоку є можливість побачити, до якого імені здійснюється запит.
Під час здійснення з'єднання з використаннямTLS, клієнт здійснює запит цифрового сертифікату вебсервера. Коли сертифікат отримано, клієнт порівнює ім'я (чи імена), закодоване у сертифікаті, з іменем хоста, до якого здійснюється з'єднання, і у випадку збігу продовжує роботу у нормальному режимі. Якщо збігу імен не виявлено, користувачеві як правило показується попередження, і з'єднання може бути перерване через можливість атаки«людина посередині». Втім, деякі програми дозволяють користувачеві обійти попередження; при цьому неявно вважається, що користувач довіряє сертифікатам, і як наслідок — встановленому з'єднанню.
Отримати заздалегідь повний список імен хостів може бути складно (або взагалі неможливо). Як наслідок, складно або неможливо отримати і сертифікат, який містить у собі всі ці імена. Серверові, що обслуговує запити для кількох імен хостів, бажано мати окремий сертифікат для кожного такого імені (або для групи взаємопов'язаних імен). Починаючи приблизно з 2005 року, організація CAcert у експериментальному порядку пропонувала кілька методів з використання TLS на віртуальних серверах,[2] більшість з яких вважалися недостатньо опрацьованими чи непрактичними. Наприклад, розширення до протоколуX.509 під назвою Subject Alternative Name (SAN) дозволяє розмістити у одному сертифікаті інформацію про кілька доменів (тобто, імен), що керуються однією особою[3]. Такі «уніфіковані» сертифікати мають бути оновлені кожного разу, коли список доменів змінюється.
Механізм віртуального хостингу дозволяє HTTP-серверові видавати різний контент в залежності від того, до якого домену було звернення (при цьому сервер має лише одну IP-адресу). Це є можливим через те, що ім'я передається клієнтом як частина HTTP-заголовку. Але у випадку HTTPS, рукостискання протоколу TLS відбуваєтьсядо того, як сервер приймає будь-які заголовки HTTP. Таким чином, сервер не може знати, який сертифікат видавати у відповідь.
Розширення SNI дозволяє вирішити дану проблему шляхом додавання імені хоста (домену) до протоколу TLS-рукотискання.[4] Сервер, знаючи, до якого саме домену буде запит, може таким чином надіслати сертифікат лише для цього домену.
ОрганізаціяIETF додала SNI до своїх «запитів коментарів» (RFC). ДокументRFC 3546 (червень 2003) має назву «Transport Layer Security (TLS) Extensions». Найбільш свіжа версія стандарту (станом на початок 2018 року) —RFC 6066.
Патч, що додає підтримку TLS/SNI до пакетуOpenSSL, з'явився 2004 року, у рамках проекту EdelKey.[5] За два роки його було портовано до гілки розробників OpenSSL, а у 2007-му — портовано до OpenSSL 0.9.8 (вперше з'явився у складі 0.9.8f[6]).
Для підтримки SNI застосунком це розширення має бути реалізоване у бібліотеці TLS, нові функції якої приймають доменне ім'я, до якого буде здійснено запит.
| Програма | Тип | Підтримка | Примітки | Підтримується з |
|---|---|---|---|---|
| Internet Explorer | Браузер | Так | Починаючи з версії 7 для ОСWindows Vista (не підтримується на XP) | 2006 |
| Mozilla Firefox | Браузер | Так | З версії 2.0 | 2006 |
| cURL | Інструмент командного рядка, бібліотека | Так | З версії 7.18.1 | 2008 |
| Safari | Браузер | Так | Не підтримується уWindows XP | |
| Google Chrome | Браузер | Так | З версії 6.0[7] | 2010 |
| BlackBerry 10 | Браузер | Так | Підтримується у всіх версіях BB10 | 2013 |
| BlackBerry OS | Браузер | Ні | Не підтримується у версії 7.1 і старіших | |
| elinks | Браузер | Ні | Не підтримується у версії 0.12pre6 і старіших | |
| Windows Mobile | Браузер | Так | Невдовзі після версії 6.5 | |
| Android default browser | Браузер | Так | Honeycomb (3.x) для планшетів і Ice Cream Sandwich (4.x) для смартфонів | 2011 |
| Firefox for Android | Браузер | Частково | Підтримується для базового перегляду, Sync і інші сервіси не підтримують SNI[8][9] | |
| wget | Інструмент командного рядка | Так | З версії 1.14 | 2012 |
| Nokia Browser for Symbian | Браузер | Ні | ||
| Opera Mobile for Symbian | Браузер | Ні | Не підтримується у ОС Series60 | |
| IBM HTTP Server | Вебсервер | Так | З версії 9.0.0[10][11] | |
| Apache Tomcat | Вебсервер | Так | Не підтримується до версії 8.5 (бекпорт з 9) | |
| Apache HTTP Server | Вебсервер | Так | З версії 2.2.12 | 2009 |
| Microsoft IIS | Вебсервер | Так | З версії 8 | 2012 |
| nginx | Вебсервер | Так | З версії 0.5.23 | 2007 |
| Jetty | Вебсервер | Так | З версії 9.3.0 | 2015 |
| Qt | Бібліотека | Так | З версії 4.8 | 2011 |
| MozillaNSS server side | Бібліотека | Ні | [12] | |
| 4th Dimension | Бібліотека | Ні | Не підтримується у версії 15.2 і раніше | |
| Java | Бібліотека | Так | З версії 1.7 | 2011 |
| ColdFusion /Lucee | Бібліотека | Так | ColdFusion з версії 10 Update 18 і 11 Update 7; Lucee з версії 4.5.1.019, версія 5.0.0.50 | 2015 |
| Erlang | Бібліотека | Так | З версії r17 | 2013 |
| Go | Бібліотека | Так | З версії 1.4 | 2011 |
| Perl | Бібліотека | Так | Починаючи зNet::SSLeay версії 1.50 іIO::Socket::SSL версії 1.56 | 2012 |
| PHP | Бібліотека | Так | З версії 5.3 | 2014 |
| Python | Бібліотека | Так | З версій 2.7.9 і 3.2 (у модуляхssl,urllib[2] іhttplib) | 2011 для Python 3.x; 2014 для Python 2.x |
| Ruby | Бібліотека | Так | З версії 2.0 (у модуліnet/http) | 2011 |