Server Name Indication
Server Name Indication (zkratka SNI) je v informatice rozšíření protokolu TLS, které zavádí v rámci HTTPS komunikace podporu pro virtuální webové servery (tj. více různých doménových jmen na jednom počítači, resp. jedné IP adrese, což se využívá při webhostingu). Pomocí SNI předává klient webovému serveru doménové jméno svého požadavku ještě před zahájením šifrované komunikace, aby server mohl vybrat odpovídající certifikát se šifrovacím klíčem. Protože k předání doménového jména dojde ještě před zahájením šifrování, je možné odposlechnout, na jaký webový server se klient připojuje, což způsobilo narušení soukromí uživatelů a využíval to síťový filtrovací a monitorovací software[1][2][3] a vlády k implementaci cenzury na internetu.[4] Ochrana SNI proti odposlechu byla uvedena v roce 2018 v TLS 1.3 jako protokol ESNI (Encrypted SNI) a jeho nedostatky byly v roce 2020 odstraněny v novém protokolu ECH,[5][6] jenž byl v roce 2023 byl začleněn do webových prohlížečů. ECH vyžaduje pro svoji funkci speciální záznam v DNS a webové prohlížeče k tomu vyžadují ještě zabezpečení DNS pomocí DoH (DNS-over-HTTPS).[7]
Problematika
Webový server je počítač, který je připojen k Internetu a má proto svoji vlastní IP adresu. Na počítači je spuštěn speciální program (tzv. démon), který na síťovém rozhraní naslouchá a čeká na požadavky, které přicházejí od klienta (typicky webový prohlížeč). Klient si nejprve doménové jméno serveru (např. wikipedia.org) přeloží pomocí DNS na IP adresu. Pak klient naváže TCP spojení na IP adresu serveru a poté si mohou obousměrně vyměňovat data. Server vidí příchozí spojení z IP adresy klienta. Požadavek klienta je vyřízen tak, že klient v navázaném TCP spojení serveru sdělí, jaká data che poslat (webová stránka, obrázek, zvuk…) a server je následně klientovi ve stejném TCP spojení zašle. Komunikace webového klienta s webovým serverem probíhá pomocí protokolu HTTP.
Virtuální webové servery
U prvotní verze protokolu HTTP 0.9 se předpokládalo, že na jednom počítači budou webové stránky jediného doménového jména. Protože to bylo nepraktické, byla ve verzi HTTP 1.0 přidána podpora tzv. virtuálních serverů, kdy může být na jednom fyzickém serveru s jednou IP adresou hostováno více webových serverů (odlišných skupin webových stránek). Pro výběr správného virtuálního serveru sdělí klient v rámci protokolu HTTP doménové jméno (v položce Host: v hlavičce dotazu) a server tak může odeslat odpověď z požadovaného virtuálního serveru. Tímto způsobem jsou nejen šetřeny IP adresy, ale je možné též ekonomicky sdružovat mnoho webových serverů na jediném počítači a obsluhovat je stejným programem.
Protokol HTTPS přidal možnost šifrování přenášených dat tak, že se veškerá přenášená data jsou šifrována (pomocí SSL/TLS). Připojí-li se klient k webovému serveru pomocí HTTPS, dojde hned na začátku komunikace k výměně šifrovacích klíčů, které však obsahují i identifikaci serveru (doménové jméno, organizace majitele, viz digitální certifikát a PKI), takže virtuální servery mívají různé šifrovací klíč (certifikáty). V okamžiku navázání komunikace tak server neví, jaký virtuální server bude klient požadovat a jaký certifikát se šifrovacím klíčem by mu měl poslat. Klient totiž název virtuálního serveru sděluje až po navázání šifrovaného spojení. Šifrované spojení je tak již však navázáno, klíče není možné změnit a klient proto uživateli ohlásí, že se neshodují údaje v certifikátu s doménovým jménem serveru uvedeným v adrese požadované stránky (URL).
Dočasná řešení
Od roku 2005 začaly certifikační autority (CA) experimentovat s různými způsoby užívání TLS na virtuálních serverech.[8] Většina experimentálních řešení byla neuspokojivých nebo velice nepraktických. Například je možné v certifikátu vyplnit položku Alternativní názvy, aby certifikát podporoval více doménových jmen najednou, ale jelikož certifikát je jen jeden, znamená to, že všechny domény musí být vlastněny a řízeny jednou osobou. Certifikát by navíc musel být vždy znovu vydán při každé změně seznamu domén, pro které je platný.
Lepším dočasným řešením bylo, že každý webový server poskytující HTTPS (šifrovanou komunikaci), musel mít svoji vlastní IP adresu.
SNI
SNI (Server Name Indication) je rozšíření pro protokol TLS, pomocí kterého klient ještě před výměnou certifikátů (veřejných klíčů u asymetrické šifry) sdělí serveru doménové jméno svého připraveného požadavku a server tak může klientovi poslat certifikát odpovídajícího virtuálního serveru ještě před zahájením šifrování. Rozšíření SNI tím zavedlo u umožnilo podporu virtuálních webových serverů i pro HTTPS služby.
Encrypted SNI
Protože u SNI dojde k předání doménového jména ještě před zahájením šifrování, je možné odposlechnout, na jaký webový server se klient připojuje, což využíval filtrovací a monitorovací software[1][2][3] a vlády k implementaci cenzury na internetu.[4] Ochranu SNI proti odposlechu představilo v roce 2018 rozšíření ESNI (Encrypted SNI), které šifrovalo jen část komunikace Client Hello.[9]
Encrypted Client Hello
Nedostatky ESNI odstranilo v roce 2020 rozšíření ECH (Encrypted Client Hello), jehož podpora byla roce 2023 začleněna do webových prohlížečů. Protokol ECH vyžaduje pro daný sever (doménu) v DNS RR záznam (HTTPS Resource Record, Type 65). Protože klienty by bylo možné dále sledovat odposlechem DNS dotazů, je pro podporu ECH v prohlížečích vyžadováno i šifrované DNS (DNS-over-HTTPS, DoH).[7] Kvůli komplexnosti ECH protokolu není jeho využití na konci roku 2023 velké.
V roce 2024 je DoH implicitně povoleno ve Windows 11 a také ve webových prohlížečích (Chrome, Firefox, Edge), což znamená že je v tomto prostředí Encrypted Client Hello automaticky používáno. Ve Windows 10 není DoH k dispozici, takže není v prohlížečích implicitně používáno. Používání DoH může v lokální sítích (LAN) obcházet bezpečnostní opatření založené na ovlivnění DNS (např. blokování nelegálního hazardu pomocí RPZ zóny v DNS serveru), takže chce-li správa sítě využít výhody DoH (ochrana soukromí, zabránění podvržení DNS atp.), musí zprovoznit vlastní DoH server a blokovat přístupy na DoH servery mimo svoji kontrolu (tj. blokovat přístup na známé IP adresy DoH serverů[10] a blokovat přístup k dalším na základě inspekce síťového provozu).[11]
Historie
SNI bylo uvedeno v roce 2003 v RFC 3546. V roce 2004 projekt EdelKey[12] vytvořil patch TLS/SNI do OpenSSL. V roce 2006 byl tento patch použit ve vývojové větvi OpenSSL a v roce 2007 začleněn do OpenSSL 0.9.8. EdelKey také vyvíjel patch pro Apache HTTP Server a ten dnes TLS/SNI podporuje s moduly gnutls a ssl. V roce 2006 bylo SNI implementováno do webových prohlížečů.
V roce 2018 bylo v protokolu TLS 1.3 uvedeno rozšíření ESNI (Encrypted SNI), které bylo začleněno do webového prohlížeče Mozilla Firefox. Protokol ESNI však trpěl nedostatky, a tak byl z Firefoxu odstraněn ve verzi 85 v prosinci 2020.[13]
Nedostatky ESNI byly v roce 2020 odstraněny v novém protokolu ECH.[5][6]
Oba protokoly ESNI a ECH jsou kompatibilní pouze s TLS 1.3, protože využívají KeyShareEntry, která byla poprvé definována jako součást TLS 1.3.[14][15] Při podpoře protokolu ECH nesmí klient pro komunikaci navrhovat nižší verzi TLS protokolu než 1.3.[16]
V srpnu 2020 začal Velký Čínský firewall blokovat provoz s ESNI, ale ECH zůstal povolen.[17] V září 2020 plánovalo ruské ministerstvo cenzury Roskomnadzor zablokovat řadu šifrovaných protokolů včetně TLS 1.3 a ESNI, což před tím bránilo přístupu cenzury k webové komunikaci.[18][19][20] V říjnu 2020 začal ruský ISP a jeho mobilní operátor Tele2 blokovat provoz s ESNI.[21]
Na konci roku 2023 je ECH dostupný v prohlížečích Mozilla Firefox (od verze 118 vydané 26. září 2023), Google Chrome (od verze 118 vydané 10. října 2023) a Microsoft Edge (testovací verze)[22][23] a je podporován webhostingem Cloudfare.[24]
Podpora prohlížečů
Software | Typ | Podporováno | Poznámky | Podporováno od |
---|---|---|---|---|
Alpine (email client) | IMAP email client | ![]() | Od verze 2.22[26] | 2019-02-18 |
Internet Explorer | Webový prohlížeč | ![]() | Od verze 7 on Vista (Není podporováno na XP) | 2006 |
Edge | Webový prohlížeč | ![]() | Všechny verze | |
Mozilla Firefox | Webový prohlížeč | ![]() | Od verze 2.0 | 2006 |
cURL | Command-line tool and library | ![]() | Od verze 7.18.1 | 2008 |
Safari | Webový prohlížeč | ![]() | Není podporováno na Windows XP | |
Google Chrome | Webový prohlížeč | ![]() | 2010 | |
BlackBerry 10 | Webový prohlížeč | ![]() | Podporováno od BB10 vydání | 2013 |
BlackBerry OS | Webový prohlížeč | Není podporováno in 7.1 a dřívějších | ||
Windows Mobile | Webový prohlížeč | Od verze 6.5 | ||
Android default browser | Webový prohlížeč | ![]() | Honeycomb (3.x) for tablets and Ice Cream Sandwich (4.x) for phones | 2011 |
Firefox for Android | Webový prohlížeč | částečně | Podporováno při prohlížení. Synchronozace a další nepodporují SNI[27][28] | |
wget | Command-line tool | ![]() | Od verze 1.14 | 2012 |
Nokia Browser for Symbian | Webový prohlížeč | ![]() | ||
Opera Mobile for Symbian | Webový prohlížeč | ![]() | Není podporováno na Series60 | |
Dillo | Webový prohlížeč | ![]() | Od verze 3.1 | 2016 |
IBM HTTP Server | Webový server | ![]() | Od verze 9.0.0[29][30] | |
Apache Tomcat | Webový server | ![]() | Není podporováno před 8.5 (backport na 9) | |
Apache HTTP Server | Webový server | ![]() | Od verze 2.2.12 | 2009 |
Microsoft IIS | Webový server | ![]() | Od verze 8 | 2012 |
nginx | Webový server | ![]() | Od verze 0.5.23 | 2007 |
Jetty | Webový server | ![]() | Od verze 9.3.0 | 2015 |
HCL Domino | Webový server | ![]() | Od verze 11.0.1 | 2020 |
Qt | Library | ![]() | Od verze 4.8 | 2011 |
Mozilla NSS server side | Library | ![]() | [31] | |
4th Dimension | Library | ![]() | Není podporováno in 15.2 or earlier | |
Java | Library | ![]() | Od verze 1.7 | 2011 |
ColdFusion / Lucee | Library | ![]() | ColdFusion Od verze 10 Update 18, 11 Update 7, Lucee Od verze 4.5.1.019, Version 5.0.0.50 | 2015 |
Erlang | Library | ![]() | Od verze r17 | 2013 |
Go | Library | ![]() | Od verze 1.4 | 2011 |
Perl | Library | ![]() | Since Net::SSLeay version 1.50 and IO::Socket::SSL version 1.56 | 2012 |
PHP | Library | ![]() | Od verze 5.3 | 2014 |
Python | Library | ![]() | Podporováno od 2.x na 2.7.9 a 3.x na 3.2 (in ssl , urllib[2] and httplib modules) | 2011 for Python 3.x and 2014 for Python 2.x |
Ruby | Library | ![]() | Od verze 2.0 (in net/http ) | 2011 |
Hiawatha | Webový server | ![]() | Od verze 8.6 | 2012 |
Servery
- Apache 2.2.12 nebo novější s podporou mod_gnutls nebo mod_ssl[32][33][34]
- Cherokee, jestliže je kompilovaný s TLS podporou
- Nové verze lighttpd 1.4.x a 1.5.x[35]
- Nginx doprovázený vestavěným OpenSSL s SNI podporou
- Microsoft IIS 8 – Ve Windows Server 8 Beta je již podpora vazeb s SNI[36]
Knihovny
- NameGerson NSS
- OpenSSL
- 0.9.8f – zkompilované s volbou
--enable-tlsext
- verze 1.0.0 obsahuje podporu SNI
- 0.9.8f – zkompilované s volbou
- GNU TLS[37]
Nepodporované operační systémy a prohlížeče
Následující kombinace nepodporují SNI
- Windows XP a Internet Explorer 6,7 a 8
- Konqueror/KDE nižší než 4.7 [38]
- Microsoft Internet Information Server IIS do verze 7 (včetně)
Knihovny
Odkazy
Reference
- ↑ a b SNI extension feature and HTTPS blocking. Web Filter [online]. [cit. 2023-11-25]. Dostupné online.
- ↑ a b Web Filtering. Sophos UTM Administrator Guide [online]. [cit. 2023-11-25]. Dostupné online.
- ↑ a b SHBAIR, Wazen. Efficiently Bypassing SNI-based HTTPS Filtering [online]. 2015-12-03 [cit. 2023-11-25]. Dostupné online.
- ↑ a b GATLAN, Sergiu. South Korea is Censoring the Internet by Snooping on SNI Traffic. BleepingComputer [online]. 2019-02-13 [cit. 2023-11-25]. Dostupné online. (anglicky)
- ↑ a b GHEDINI, Alessandro. Encrypt it or lose it: how encrypted SNI works [online]. 2018-09-24 [cit. 2021-07-11]. Dostupné online. (anglicky) Je zde použita šablona
{{Cite web}}
označená jako k „pouze dočasnému použití“. - ↑ a b Make ESNI TLS 1.2 compatible · Issue #38 · tlswg/draft-ietf-tls-esni [online]. [cit. 2020-08-09]. Dostupné online. Je zde použita šablona
{{Cite web}}
označená jako k „pouze dočasnému použití“. - ↑ a b WYMAN, Alice. Encrypted Client Hello (ECH) - Frequently asked questions. Firefox Help [online]. [cit. 2023-11-25]. Dostupné online.
- ↑ CAcert VHostTaskForce [online]. [cit. 2009-11-03]. (CAcert Wik). Dostupné v archivu pořízeném dne 2009-08-22.
- ↑ WOOD, Chriss. ESNI -> ECHO by chris-wood · Pull Request #207 · tlswg/draft-ietf-tls-esni. GitHub [online]. 2020-03-08 [cit. 2023-11-27]. Dostupné online. (anglicky)
- ↑ ORIN, Thomas. Secure DNS Client over HTTPS (DoH) on Windows Server 2022. learn.microsoft.com [online]. 2023-12-03 [cit. 2024-07-02]. Dostupné online. (anglicky)
- ↑ GYONGYOȘI, Livia. What is DNS over HTTPS? Definition, Implementation, Benefits, and More. Heimdal Security Blog [online]. 2023-06-20 [cit. 2024-07-02]. Dostupné online. (anglicky)
- ↑ EdelKey Project [online]. [cit. 2009-11-03]. Dostupné v archivu pořízeném dne 2016-04-04.
- ↑ CHANG, Kershaw. 1667743 - Clean up unused esni code. bugzilla.mozilla.org [online]. 2020-09-28 [cit. 2023-11-27]. Dostupné online. (anglicky)
- ↑ Encrypt it or lose it: how encrypted SNI works. The Cloudflare Blog [online]. 2018-09-24 [cit. 2023-11-27]. Dostupné online. (anglicky)
- ↑ Make ESNI TLS 1.2 compatible · Issue #38 · tlswg/draft-ietf-tls-esni. GitHub [online]. [cit. 2023-11-27]. Dostupné online. (anglicky)
- ↑ RESCORLA, Eric. TLS Encrypted Client Hello. tlswg.org [online]. [cit. 2023-11-27]. Dostupné online. (anglicky)
- ↑ CIMPANU, Catalin. China is now blocking all encrypted HTTPS traffic that uses TLS 1.3 and ESNI. ZDNET [online]. 2020-08-08 [cit. 2023-11-27]. Dostupné online. (anglicky)
- ↑ Russia’s Digital Development Ministry wants to ban the latest encryption technologies from the RuNet. Meduza [online]. 2020-09-21 [cit. 2023-11-27]. Dostupné online. (anglicky)
- ↑ CIMPANU, Catalin. Russia wants to ban the use of secure protocols such as TLS 1.3, DoH, DoT, ESNI. ZDNET [online]. 2020-09-22 [cit. 2023-11-27]. Dostupné online. (anglicky)
- ↑ SHERMAN, Justin. Russia Is Trying Something New to Isolate Its Internet From the Rest of the World. Slate. 2020-09-25. Dostupné online [cit. 2023-11-27]. ISSN 1091-2339. (anglicky)
- ↑ Почему Ростелеком блокирует ESNI трафик?. Хабр Q&A — вопросы и ответы [online]. 2020-10-11 [cit. 2023-11-27]. Dostupné online. (rusky)
- ↑ WYMAN, Alice. Understand Encrypted Client Hello (ECH). Firefox Help [online]. 2023-09-26 [cit. 2023-11-25]. Dostupné online.
- ↑ JACKSON, Dennis. Say (an encrypted) hello to a more private internet. The Mozilla Blog [online]. 2023-10-03 [cit. 2023-11-25]. Dostupné online. (anglicky)
- ↑ MANDELE, Achiel. Encrypted Client Hello - the last puzzle piece to privacy. The Cloudflare Blog [online]. 2023-09-29 [cit. 2023-11-25]. Dostupné online. (anglicky)
- ↑ CAcert VHostTaskForce [online]. [cit. 2008-10-27]. Dostupné v archivu pořízeném z originálu dne 22 August 2009. Je zde použita šablona
{{Cite web}}
označená jako k „pouze dočasnému použití“. - ↑ https://repo.or.cz/alpine.git/commit/08fcd1b86979b422eb586e56459d6fe15333e500
- ↑ Bug 765064 — HttpClient in use by Sync and other services doesn't support SNI [online]. 29 October 2017 [cit. 2017-11-09]. Dostupné online. Je zde použita šablona
{{Cite web}}
označená jako k „pouze dočasnému použití“. - ↑ Bug 1412650 — Switch services.* code to use HttpsURLConnection [online]. 29 October 2017 [cit. 2017-11-09]. Dostupné online. Je zde použita šablona
{{Cite web}}
označená jako k „pouze dočasnému použití“. - ↑ IBM HTTP Server SSL Questions and Answers [online]. IBM [cit. 2011-03-08]. Dostupné online. Je zde použita šablona
{{Cite web}}
označená jako k „pouze dočasnému použití“. - ↑ IHS 8 powered by Apache 2.2.x ? [online]. IBM, 17 October 2013 [cit. 2017-11-09]. Dostupné v archivu pořízeném z originálu dne 26 December 2015. Je zde použita šablona
{{Cite web}}
označená jako k „pouze dočasnému použití“. - ↑ Bug 360421 — Implement TLS Server Name Indication for servers [online]. 11 November 2006 [cit. 2012-10-30]. Dostupné online. Je zde použita šablona
{{Cite web}}
označená jako k „pouze dočasnému použití“. - ↑ Bug 34607: Support for Server Name Indication [online]. Apache Software Foundation. Dostupné online.
- ↑ Revision 776281: adding support for Server Name Indication to the Apache 2.2.x branch [online]. Apache Software Foundation. Dostupné online.
- ↑ CHANGES: Server Name Indication support is listed under the changes for Apache 2.2.12 [online]. Apache Software Foundation. Dostupné online.
- ↑ #386 (TLS servername extension (SNI) for namebased TLS-vhosts) - lighttpd - Trac
- ↑ Řešení problému s hostováním více https webů na Windows [online]. Petr Barták, Uzuzu-cz [cit. 2012-03-06]. Dostupné v archivu pořízeném dne 2012-03-13.
- ↑ Server name indication (GnuTLS 3.6.2). www.gnutls.org [online]. [cit. 2018-07-13]. Dostupné online.
- ↑ Bug 122433 - Server Name Identification support
- ↑ 188841 - It would be useful if QSslSocket supports TLS extensions such as Server Name Indication as per RFC 3546[nedostupný zdroj]
- ↑ Qt Patch and merge request. qt.gitorious.org [online]. [cit. 2009-11-03]. Dostupné v archivu pořízeném dne 2009-11-09.
- ↑ NSS Roadmap (as of 11 September 2009)
- ↑ Support TLS SNI extension in ssl module
Externí odkazy
- https://www.cloudflare.com/ssl/encrypted-sni/ – kontrola podpory ECH ve webovém prohlížeči
- https://www.reddit.com/r/CloudFlare/comments/171fvih/how_do_i_check_if_a_site_supports_the_newly/ – kontrola podpory ECH na webové adrese