Індикація імені сервера (, SNI) — розширення протоколу TLS, що надає можливість клієнтському комп'ютеру зазначати на початку процесу «рукотискання» (), до якого імені хосту ініціюється з'єднання. Це дозволяє серверові видавати більше ніж один публічний сертифікат при використанні лише однієї IP-адреси і TCP порту, і таким чином надає можливість організації множинних HTTPS-сайтів (або інших послуг через протокол TLS) на одній IP-адресі, кожен зі своїм сертифікатом. SNI концептуально еквівалентний механізмові віртуального хостингу у HTTP/1.1. Ім'я хосту передається у незашифрованому вигляді, так що при перехопленні мережного потоку є можливість побачити, до якого імені здійснюється запит.

Опис проблеми Під час здійснення з'єднання з використанням TLS, клієнт здійснює запит цифрового сертифікату вебсервера. Коли сертифікат отримано, клієнт порівнює ім'я (чи імена), закодоване у сертифікаті, з іменем хоста, до якого здійснюється з'єднання, і у випадку збігу продовжує роботу у нормальному режимі. Якщо збігу імен не виявлено, користувачеві як правило показується попередження, і з'єднання може бути перерване через можливість атаки «людина посередині». Втім, деякі програми дозволяють користувачеві обійти попередження; при цьому неявно вважається, що користувач довіряє сертифікатам, і як наслідок — встановленому з'єднанню.

Отримати заздалегідь повний список імен хостів може бути складно (або взагалі неможливо). Як наслідок, складно або неможливо отримати і сертифікат, який містить у собі всі ці імена. Серверові, що обслуговує запити для кількох імен хостів, бажано мати окремий сертифікат для кожного такого імені (або для групи взаємопов'язаних імен). Починаючи приблизно з 2005 року, організація CAcert у експериментальному порядку пропонувала кілька методів з використання TLS на віртуальних серверах, більшість з яких вважалися недостатньо опрацьованими чи непрактичними. Наприклад, розширення до протоколу X.509 під назвою Subject Alternative Name (SAN) дозволяє розмістити у одному сертифікаті інформацію про кілька доменів (тобто, імен), що керуються однією особою. Такі «уніфіковані» сертифікати мають бути оновлені кожного разу, коли список доменів змінюється.

Механізм віртуального хостингу дозволяє HTTP-серверові видавати різний контент в залежності від того, до якого домену було звернення (при цьому сервер має лише одну IP-адресу). Це є можливим через те, що ім'я передається клієнтом як частина HTTP-заголовку. Але у випадку HTTPS, рукостискання протоколу TLS відбувається до того, як сервер приймає будь-які заголовки HTTP. Таким чином, сервер не може знати, який сертифікат видавати у відповідь.

SNI як вирішення проблеми Розширення SNI дозволяє вирішити дану проблему шляхом додавання імені хоста (домену) до протоколу TLS-рукотискання. Сервер, знаючи, до якого саме домену буде запит, може таким чином надіслати сертифікат лише для цього домену.

Організація IETF додала SNI до своїх «запитів коментарів» (RFC). Документ RFC 3546 (червень 2003) має назву «Transport Layer Security (TLS) Extensions». Найбільш свіжа версія стандарту (станом на початок 2018 року) — RFC 6066.

Реалізація Патч, що додає підтримку TLS/SNI до пакету OpenSSL, з'явився 2004 року, у рамках проекту EdelKey. За два роки його було портовано до гілки розробників OpenSSL, а у 2007-му — портовано до OpenSSL 0.9.8 (вперше з'явився у складі 0.9.8f ).

Для підтримки 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 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 wget Інструмент командного рядка З версії 1.14 2012 Nokia Browser for Symbian Браузер Opera Mobile for Symbian Браузер Не підтримується у ОС Series60 IBM HTTP Server Вебсервер З версії 9.0.0 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 Mozilla NSS server side Бібліотека 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 і httplib) 2011 для Python 3.x; 2014 для Python 2.x Ruby Бібліотека З версії 2.0 (у модулі net/http) 2011

Джерела