Server Name Indication

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Опис проблеми[ред. | ред. код]

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

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

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

SNI як вирішення проблеми[ред. | ред. код]

Розширення 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
Mozilla NSS 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

Джерела[ред. | ред. код]

  1. Шаблон:Cite IETF
  2. CAcert VHostTaskForce. CAcert Wiki. 
  3. What is a Multiple Domain (UCC) SSL Certificate?. GoDaddy. 
  4. TLS Server Name Indication. Paul's Journal. 
  5. EdelKey Project. 
  6. OpenSSL CHANGES. Архів оригіналу за 20 April 2016. 
  7. IIS 8 and IIS 8.5 SNI Browser Support. DigiCert. Процитовано 31 December 2015. 
  8. Bug 765064 — HttpClient in use by Sync and other services doesn't support SNI. Bugzilla@Mozilla. 29 October 2017. Процитовано 9 November 2017. 
  9. Bug 1412650 — Switch services.* code to use HttpsURLConnection. Bugzilla@Mozilla. 29 October 2017. Процитовано 9 November 2017. 
  10. IBM HTTP Server SSL Questions and Answers. IBM. Процитовано 8 March 2011. 
  11. IHS 8 powered by Apache 2.2.x ?. IBM. 17 October 2013. Архів оригіналу за 26 December 2015. Процитовано 9 November 2017. 
  12. Bug 360421 — Implement TLS Server Name Indication for servers. Bugzilla@Mozilla. 11 November 2006. Процитовано 30 October 2012.