Wskazanie nazwy serwera — Server Name Indication
Server Name Indication ( SNI ) jest rozszerzeniem protokołu sieciowego TLS ( Transport Layer Security ) , za pomocą którego klient wskazuje nazwę hosta, z którą próbuje się połączyć na początku procesu uzgadniania. Pozwala to serwerowi prezentować jeden z wielu możliwych certyfikatów na tym samym adresie IP i numerze portu TCP, a tym samym umożliwia obsługę wielu bezpiecznych ( HTTPS ) witryn internetowych (lub dowolnej innej usługi przez TLS) przez ten sam adres IP bez wymagania wszystkich tych witryn używać tego samego certyfikatu. Jest to koncepcyjny odpowiednik wirtualnego hostingu opartego na nazwach HTTP/1.1 , ale dla protokołu HTTPS. Pozwala to również serwerowi proxy na przekazywanie ruchu klienta do właściwego serwera podczas uzgadniania TLS/SSL. Żądana nazwa hosta nie jest zaszyfrowana w oryginalnym rozszerzeniu SNI, więc podsłuchujący może zobaczyć, która witryna jest żądana.
Tło problemu
Przed SNI podczas nawiązywania połączenia TLS klient nie miał możliwości określenia, z którą witryną próbuje się połączyć. Dlatego jeśli jeden fizyczny serwer obsługuje wiele witryn, serwer nie ma możliwości sprawdzenia, którego certyfikatu użyć w protokole TLS. Mówiąc bardziej szczegółowo, podczas nawiązywania połączenia TLS klient żąda certyfikatu cyfrowego od serwera WWW. Gdy serwer wyśle certyfikat, klient sprawdza go i porównuje nazwę, z którą próbował się połączyć, z nazwami zawartymi w certyfikacie. Jeśli dojdzie do dopasowania, połączenie będzie przebiegać normalnie. Jeśli dopasowanie nie zostanie znalezione, użytkownik może zostać ostrzeżony o rozbieżności, a połączenie może zostać przerwane, ponieważ niezgodność może wskazywać na próbę ataku typu man-in-the-middle . Jednak niektóre aplikacje pozwalają użytkownikowi ominąć ostrzeżenie, aby kontynuować połączenie, przy czym użytkownik przejmuje odpowiedzialność za zaufanie do certyfikatu i, co za tym idzie, połączenia.
Jednak uzyskanie pojedynczego certyfikatu obejmującego wszystkie nazwy, za które będzie odpowiedzialny serwer, może być trudne – a nawet niemożliwe z powodu braku pełnej listy wszystkich nazw. Serwer odpowiedzialny za wiele nazw hostów prawdopodobnie będzie musiał przedstawić inny certyfikat dla każdej nazwy (lub małej grupy nazw). Możliwe jest użycie subjectAltName do umieszczenia wielu domen kontrolowanych przez jedną osobę w jednym certyfikacie. Takie „certyfikaty ujednoliconej komunikacji” muszą być wydawane ponownie za każdym razem, gdy zmienia się lista domen.
Hosting wirtualny oparty na nazwach umożliwia hostowanie wielu nazw hostów DNS przez jeden serwer (zwykle serwer sieci Web) pod tym samym adresem IP. W tym celu serwer używa nazwy hosta prezentowanej przez klienta w ramach protokołu (w przypadku HTTP nazwa ta jest prezentowana w nagłówku hosta ). Jednak w przypadku korzystania z protokołu HTTPS uzgadnianie TLS ma miejsce, zanim serwer zobaczy nagłówki HTTP. W związku z tym serwer nie mógł użyć informacji z nagłówka hosta HTTP, aby zdecydować, który certyfikat przedstawić i jako takie tylko nazwy objęte tym samym certyfikatem mogą być obsługiwane z tego samego adresu IP.
W praktyce oznaczało to, że serwer HTTPS mógł obsługiwać tylko jedną domenę (lub małą grupę domen) na adres IP w celu bezpiecznego i wydajnego przeglądania. Przypisanie oddzielnego adresu IP dla każdej witryny zwiększa koszt hostingu, ponieważ żądania adresów IP muszą być uzasadnione w regionalnym rejestrze internetowym, a adresy IPv4 są teraz wyczerpane . W przypadku protokołu IPv6 zwiększa to obciążenie administracyjne dzięki posiadaniu wielu adresów IP na jednym komputerze, nawet jeśli przestrzeń adresowa nie jest wyczerpana. W rezultacie wiele stron internetowych zostało skutecznie powstrzymywanych przed korzystaniem z bezpiecznej komunikacji.
Zasady techniczne
SNI rozwiązuje ten problem, wysyłając klientowi nazwę domeny wirtualnej jako część komunikatu ClientHello negocjacji TLS . Dzięki temu serwer może wcześniej wybrać odpowiednią domenę wirtualną i przedstawić przeglądarce certyfikat zawierający poprawną nazwę. Dlatego w przypadku klientów i serwerów, które implementują SNI, serwer z jednym adresem IP może obsługiwać grupę nazw domen, dla których uzyskanie wspólnego certyfikatu jest niepraktyczne.
SNI dodano do IETF „s RFC internetowych w czerwcu 2003 roku przez RFC 3546, Transport Layer Security (TLS) Extensions . Najnowsza wersja standardu to RFC 6066.
Implikacje dla bezpieczeństwa
Ładunek Server Name Indication nie jest szyfrowany, dlatego nazwa hosta serwera, z którym klient próbuje się połączyć, jest widoczna dla pasywnego podsłuchującego. Ta słabość protokołu została wykorzystana przez oprogramowanie zabezpieczające do filtrowania i monitorowania sieci oraz rządy do wprowadzenia cenzury. Obecnie istnieje wiele technologii próbujących ukryć wskazanie nazwy serwera.
Frontowanie domeny
Fronting domeny to technika zastępowania żądanej nazwy hosta w SNI inną hostowaną przez ten sam serwer lub, częściej, sieć serwerów znaną jako Content Delivery Network. Gdy klient korzysta z frontu domeny, zastępuje domenę serwera w SNI (niezaszyfrowaną), ale pozostawia ją w nagłówku hosta HTTP (który jest szyfrowany przez TLS), aby serwer mógł obsługiwać odpowiednią zawartość. Fronton domeny narusza standard definiujący sam SNI, więc jego kompatybilność jest ograniczona (wiele usług sprawdza, czy host SNI odpowiada hostowi nagłówka HTTP i odrzuca połączenia z SNI z frontem domeny jako nieprawidłowe). Podczas gdy fronting domeny był używany w przeszłości w celu uniknięcia rządowej cenzury, jego popularność spadła, ponieważ główni dostawcy usług w chmurze (Google, Amazon AWS i CloudFront) wyraźnie zabraniają tego w swoich TOS i nakładają na to ograniczenia techniczne.
Zaszyfrowany klient Witaj
Encrypted Client Hello ( ECH ) to rozszerzenie protokołu TLS 1.3, które umożliwia szyfrowanie całej wiadomości Client Hello, która jest wysyłana na wczesnym etapie negocjacji TLS 1.3. ECH szyfruje ładunek za pomocą klucza publicznego, który strona ufająca (przeglądarka internetowa) musi znać z wyprzedzeniem, co oznacza, że ECH jest najbardziej efektywny w przypadku dużych sieci CDN znanych z wyprzedzeniem dostawcom przeglądarek.
Początkowa wersja tego rozszerzenia z 2018 r. nosiła nazwę Encrypted SNI ( ESNI ), a jej implementacje zostały wdrożone w sposób „eksperymentalny”, aby wyeliminować ryzyko podsłuchiwania domeny. W przeciwieństwie do ECH, Encrypted SNI szyfruje tylko SNI, a nie całe Client Hello. Wsparcie opt-in dla tej wersji zostało włączone do Firefoksa w październiku 2018 i wymagało włączenia DNS-over-HTTPS.
W marcu 2020 r. ESNI został przerobiony na rozszerzenie ECH, po tym, jak analiza wykazała, że szyfrowanie samego SNI jest niewystarczające. Na przykład specyfikacje zezwalają rozszerzeniu klucza wstępnego na zawieranie dowolnych danych ułatwiających wznawianie sesji, nawet przesyłanie kopii jawnego tekstu dokładnie tej samej nazwy serwera, która jest zaszyfrowana przez ESNI. Ponadto szyfrowanie rozszerzeń pojedynczo wymagałoby zaszyfrowanego wariantu każdego rozszerzenia, z których każde ma potencjalne konsekwencje dla prywatności, a nawet ujawnia zestaw reklamowanych rozszerzeń. Wreszcie, rzeczywiste wdrożenie ESNI ujawniło ograniczenia interoperacyjności. Skrócona nazwa brzmiała ECHO w marcu 2020 r. i została zmieniona na ECH w maju 2020 r.
Zarówno ESNI, jak i ECH są kompatybilne tylko z TLS 1.3, ponieważ opierają się na KeyShareEntry, który został po raz pierwszy zdefiniowany w TLS 1.3. Ponadto, aby korzystać z ECH, klient nie może proponować wersji TLS poniżej 1.3.
W sierpniu 2020 r. Wielka Chińska zapora sieciowa zaczęła blokować ruch ESNI, jednocześnie zezwalając na ruch ECH.
W październiku 2020 r. rosyjski ISP Rostelecom i jego operator komórkowy Tele2 rozpoczęli blokowanie ruchu ESNI. We wrześniu tego samego roku rosyjski minister cenzury Roskomnadzor planował zakazać szeregu protokołów szyfrowania, w tym TLS 1.3 i ESNI, które utrudniały cenzurę dostępu do stron internetowych.
Realizacja
W 2004 roku projekt EdelKey stworzył łatkę do dodawania TLS/SNI do OpenSSL . W 2006 roku ta poprawka została następnie przeniesiona do gałęzi rozwojowej OpenSSL, a w 2007 została przeportowana wstecznie do OpenSSL 0.9.8 (po raz pierwszy wydana w wersji 0.9.8f).
Aby aplikacja mogła zaimplementować SNI, używana przez nią biblioteka TLS musi ją implementować, a aplikacja musi przekazać nazwę hosta do biblioteki TLS. Jeszcze bardziej komplikując sprawy, biblioteka TLS może być zawarta w programie aplikacji lub być składnikiem bazowego systemu operacyjnego. Z tego powodu niektóre przeglądarki implementują SNI, gdy działają w dowolnym systemie operacyjnym, podczas gdy inne implementują go tylko w określonych systemach operacyjnych.
Wsparcie
Oprogramowanie | Rodzaj | Utrzymany | Uwagi | Obsługiwane od |
---|---|---|---|---|
Alpine (klient poczty e-mail) | Klient poczty e-mail IMAP | tak | Od wersji 2.22 | 2019-02-18 |
Internet Explorer | przeglądarka internetowa | tak | Od wersji 7 w systemie Vista (nieobsługiwane w XP) | 2006 |
Krawędź | przeglądarka internetowa | tak | Wszystkie wersje | |
Mozilla Firefox | przeglądarka internetowa | tak | Od wersji 2.0 | 2006 |
kędzior | Narzędzie i biblioteka wiersza poleceń | tak | Od wersji 7.18.1 | 2008 |
Safari | przeglądarka internetowa | tak | Nieobsługiwane w systemie Windows XP | |
Google Chrome | przeglądarka internetowa | tak | 2010 | |
BlackBerry 10 | przeglądarka internetowa | tak | Obsługiwane we wszystkich wersjach BB10 | 2013 |
System operacyjny BlackBerry | ||||
Barakuda WAF | Odwrotny serwer proxy | tak | Obsługiwane od wersji 7.8 | 2013 |
Barakuda ADC | System równoważenia obciążenia | tak | Wsparcie frontendu od wersji 4.0 i wsparcie backendu od v5.2 | Frontend 2013 / Backend 2015 |
Windows Mobile | przeglądarka internetowa | Jakiś czas po 6,5 | ||
Domyślna przeglądarka Androida | przeglądarka internetowa | tak | Honeycomb (3.x) na tablety i Ice Cream Sandwich (4.x) na telefony | 2011 |
Firefox dla Androida | przeglądarka internetowa | tak | Obsługiwane do przeglądania. Synchronizacja i inne usługi obsługują SNI tylko od wersji 86. | |
wget | Narzędzie wiersza poleceń | tak | Od wersji 1.14 | 2012 |
Przeglądarka Nokia dla Symbian | przeglądarka internetowa | Nie | ||
Opera Mobile na Symbian | przeglądarka internetowa | Nie | Nieobsługiwane w Series60 | |
Dillo | przeglądarka internetowa | tak | Od wersji 3.1 | 2016 |
Serwer IBM HTTP | serwer internetowy | tak | Od wersji 9.0.0 | |
Apache Tomcat | serwer internetowy | tak | Nieobsługiwane przed 8.5 (backport od 9) | |
Serwer HTTP Apache | serwer internetowy | tak | Od wersji 2.2.12 | 2009 |
Microsoft IIS | serwer internetowy | tak | Od wersji 8 | 2012 |
nginx | serwer internetowy | tak | Od wersji 0.5.23 | 2007 |
Molo | serwer internetowy | tak | Od wersji 9.3.0 | 2015 |
HCL Domino | serwer internetowy | tak | Od wersji 11.0.1 | 2020 |
Qt | Biblioteka | tak | Od wersji 4.8 | 2011 |
Strona serwera Mozilla NSS | Biblioteka | Nie | ||
4. Wymiar | Biblioteka | Nie | Nieobsługiwane w wersji 15.2 lub wcześniejszych | |
Jawa | Biblioteka | tak | Od wersji 1.7 | 2011 |
ColdFusion / Lucee | Biblioteka | tak | ColdFusion od wersji 10, aktualizacja 18, 11, aktualizacja 7, Lucee od wersji 4.5.1.019, wersja 5.0.0.50 | 2015 |
Erlang | Biblioteka | tak | Od wersji r17 | 2013 |
Udać się | Biblioteka | tak | Od wersji 1.4 | 2011 |
Perl | Biblioteka | tak | Od Net::SSLeay wersji 1.50 i IO::Socket::SSL 1.56 |
2012 |
PHP | Biblioteka | tak | Od wersji 5.3 | 2014 |
Pyton | Biblioteka | tak | Obsługiwane 2.x od 2.7.9 3.x od 3,2 (IN ssl , urllib[2] a httplib moduły) |
2011 dla Pythona 3.x i 2014 dla Pythona 2.x |
Rubin | Biblioteka | tak | Od wersji 2.0 (w net/http ) |
2011 |
Hiawatha | serwer internetowy | tak | Od wersji 8.6 | 2012 |
lighttpd | serwer internetowy | tak | Od wersji 1.4.24 | 2009 |
HAProxy | System równoważenia obciążenia | tak | Od wersji 1.5-dev12 | 2012 |
OpenBSD httpd | serwer internetowy | tak | Od wersji OpenBSD 6.1 | 2017-04-11 |