SNI технология - какво означава и как работи?

Помощен център

SNI технология - какво означава и как работи?

В тази статия ще ви покажем в какво се състои разликата между HTTP, HTTPS и SNI без да навлизаме в излишни технически подробности.

Начин на работа на HTTP

При традиционният споделен хостинг клиента (браузера на потребителя) създава HTTP заявка, DNS системата резолва IP адреса на сървъра и заявката се изпраща към сървъра.

GET /hello.html HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36 OPR/49.0.2725.47
Host: www.example.com 
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

Сървъра взима хост името от заявката (в приемера: www.example.com) и в своята конфигурация открива записа за съответния виртуален хост, базиран на имена (name-based virtual host). От конфигурираната DocumentRoot на сайта сървъра доставя на клиента поискания файл и уеб страницата http://www.example.com/hello.html се зарежда в браузера.


    DocumentRoot "/www/example1"
    ServerName www.example.com
    # Other directives here

Начин на работа на HTTPS

Когато клиента създаде HTTPS заявка, отново DNS резолва IP адреса на сървъра и изпраща заявката, но тъй като на този IP адрес може да има инсталиран само един SSL сертификат, клиента и сървъра започват директно процеса handshake (здрависване) като уточняват наличните шифри и създават споделен ключ за криптиране на HTTPS сесията.

Ако на същия IP адрес има конфигурирани няколко различни сайта, те всички ще зареждат сайта със сертификата тъй като SSL не поддържа виртуален хостинг базиран на имена и обвързва IP адреса с домейна, посочен в SSL сертификата.


    DocumentRoot /var/www/website
    ServerName www.example.com
    SSLEngine on
    SSLCertificateFile /etc/ssl/crt/primary.crt
    SSLCertificateKeyFile /etc/ssl/crt/private.key
    SSLCertificateChainFile /etc/ssl/crt/intermediate.crt

Какво променя SNI?

SNI е съкращение от Server Name Indication и означава Посочване името на сървъра. SNI е разширение на протокола TLS и показва с кой от хостваните на сървъра домейни клиента желае да установи криптирана връзка в началото на процеса handshake (здрависване).

Получавайки домейн името още в заявката сървъра избира подходящия SSL сертификат, който изпраща обратно на клиента за проверка.

Клиентът сравнява хост името, с което се опитва да се свърже с домейн името, записано в сертификата.

Ако двете имена съвпадат, установяването на криптирана връзка продължава следвайки стандартния TLS протокол.

NameVirtualHost *:443


     ServerName www.example.com
     DocumentRoot /var/www/site
     SSLEngine on
     SSLCertificateFile /path/to/www.example.com.crt
     SSLCertificateKeyFile /path/to/www.example.com.key
     SSLCertificateChainFile /path/to/ca-bundle.crt



     ServerName www.example.net
     DocumentRoot /var/www/example.net
     SSLEngine on
     SSLCertificateFile /path/to/www.example.net.crt
     SSLCertificateKeyFile /path/to/www.example.net.key
     SSLCertificateChainFile /path/to/ca-bundle.crt

Ако няма съвпадение, потребителят може да бъде предупреден за несъответствието и връзката може да бъде отменена, тъй като несъответствието може да означава опит за атака от типа man-in-the-middle (човек-в-средата).

SNI решава проблема с недостатъчния брой свободни IPv4 адреси за да може всеки сайт да бъде защитен със собствен SSL сертификат.

SNI прави възможно от сървър с един IPv4 адрес да се зареждат голям брой HTTPS сайтове вместо всеки HTTPS сайт да ползва отделен IPv4 адрес.

Браузъри, който поддържат SNI

За да се използва Server Name Indication SNI, библиотеката SSL/TLS трябва да може да поддържа SNI чрез приложение. Освен това приложението трябва да изпрати името на хоста в библиотеката SSL/TLS. Въпреки че редица браузъри и сървъри все още не поддържат SNI, повечето нови уеб браузъри и SSL/TLS библиотеки вече са внедрили SNI поддръжка.

Следните браузъри предлагат поддръжка за SNI:

  • Internet Explorer 7 или по-нова, на Windows Vista или по-нова версия. Не работи в Windows XP и Internet Explorer 8
  • Mozilla Firefox 2.0 или по-нова
  • Opera 8.0 или по-нова версия (трябва да бъде приложен протоколът TLS 1.1)
  • Opera Mobile, версията трябва да е най-малко 10.1 бета за Android
  • Google Chrome (Windows Vista или по-нова версия, Windows XP изисква Chrome 6 или по-нова версия, OS X 10.5.7 или по-нова версия изисква Chrome 5.0.342.1 или по-нова версия)
  • Konqueror / KDE 4.7 или по-нова
  • MobileSafari за Apple iOS 4.0 или по-нова версия
  • Android standard browser на Honeycomb (v3.x) или по-нова
  • Windows Phone 7
  • MicroB на Maemo

Сървъри, които поддържат SNI

  • Apache 2.2.12 или по-нова, трябва да използва mod_ssl
  • Apache Traffic Server 3.2.0 или по-нова версия
  • Cherokee, трябва да има поддръжка на TLS
  • Всички версии на lighttpd 1.4.x и 1.5.x with patch, 1.4.24 или по-нова without patch
  • Nginx с внедрена OpenSSL с поддръжка на SNI
  • F5 Networks Local Traffic Manager, версия 11.1 или по-нова версия
  • G-WAN уеб приложение. Сървърът трябва да използва OpenSSL с поддръжка на SNI
  • LiteSpeed ​​4.1 или по-нова версия
  • Pound 2.6 или по-нова
  • Apache Tomcat на Java 7 или по-нова
  • Microsoft Internet Information Server IIS 8
  • Saetta Web Server през OpenSSL
  • Citrix NetScaler 9.2 или по-нова
  • HAProxy 1.5 или по-нова

Заключение

Без съмнение бъдещето принадлежи на SNI, но за момента значителен брой потребители все още ползват софтуер или устройства, които не поддържат разширението.

На практика това означава, че за сериозен уеб сайт за електронна търговия или такъв, който се нуждае от достъп до широк кръг посетители, това решение няма да работи - все още.

Очакваме през следващата година или в близко бъдеще все повече интернет потребители да започнат да използват модерни устройства и все повече браузъри да включат поддръжка на SNI.