В тази статия ще Ви покажем в какво се състои разликата между 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
се зарежда в браузъра.
<VirtualHost *:80>
DocumentRoot "/www/example1"
ServerName www.example.com
# Other directives here
</VirtualHost>
Начин на работа на HTTPS
Когато клиентът създаде HTTPS заявка, отново DNS резолва IP адреса на сървъра и изпраща заявката, но тъй като на този IP адрес може да има инсталиран само един SSL сертификат, клиентът и сървърът започват директно процеса handshake (здрависване) като уточняват наличните шифри и създават споделен ключ за криптиране на HTTPS сесията.
Ако на същия IP адрес има конфигурирани няколко различни сайта, те всички ще зареждат сайта със сертификата тъй като SSL не поддържа виртуален хостинг базиран на имена и обвързва IP адреса с домейна, посочен в SSL сертификата.
<VirtualHost 192.168.0.1:443>
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
</VirtualHost>
Какво променя SNI?
SNI е съкращение от Server Name Indication и означава Посочване името на сървъра. SNI е разширение на протокола TLS и показва с кой от хостваните на сървъра домейни клиентът желае да установи криптирана връзка в началото на процеса handshake (здрависване).
Получавайки домейн името още в заявката сървърът избира подходящия SSL сертификат, който изпраща обратно на клиента за проверка.
Клиентът сравнява хост името, с което се опитва да се свърже, с домейн името, записано в сертификата.
Ако двете имена съвпадат, установяването на криптирана връзка продължава следвайки стандартния TLS протокол.
<VirtualHost *: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
</VirtualHost>
<VirtualHost *:443>
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
</VirtualHost>
Ако няма съвпадение, потребителят може да бъде предупреден за несъответствието и връзката може да бъде отменена, тъй като несъответствието може да означава опит за атака от типа man-in-the-middle (човек-в-средата).
SNI решава проблема с недостатъчния брой свободни IPv4 адреси, за да може всеки сайт да бъде защитен със собствен SSL сертификат.
SNI прави възможно от сървър с един IPv4 адрес да се зареждат голям брой HTTPS сайтове, вместо всеки HTTPS сайт да ползва отделен IPv4 адрес.
Браузъри и сървъри, които поддържат SNI
За да се използва Server Name Indication SNI, библиотеката SSL/TLS трябва да може да поддържа SNI чрез приложение. Освен това приложението трябва да изпрати името на хоста в библиотеката SSL/TLS.
Най-използваните съвременни браузъри поддържат SNI – https://caniuse.com/sni.
Най-използваните сървъри също поддържат SNI – https://en.wikipedia.org/wiki/Server_Name_Indication#Support.
В хостинг акаунта можете да инсталирате много SSL сертификати за различните домейни, като няма да Ви е нужен отделен собствен IP адрес за всеки. Вижте още: 3 мита за самостоятелния IP адрес | Blog