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čů

Podpora SNI[25]
SoftwareTypPodporovánoPoznámkyPodporováno od
Alpine (email client)IMAP email clientAnoAnoOd verze 2.22[26]2019-02-18
Internet ExplorerWebový prohlížečAnoAnoOd verze 7 on Vista (Není podporováno na XP)2006
EdgeWebový prohlížečAnoAnoVšechny verze
Mozilla FirefoxWebový prohlížečAnoAnoOd verze 2.02006
cURLCommand-line tool and libraryAnoAnoOd verze 7.18.12008
SafariWebový prohlížečAnoAnoNení podporováno na Windows XP
Google ChromeWebový prohlížečAnoAno2010
BlackBerry 10Webový prohlížečAnoAnoPodporováno od BB10 vydání2013
BlackBerry OSWebový prohlížečNení podporováno in 7.1 a dřívějších
Windows MobileWebový prohlížečOd verze 6.5
Android default browserWebový prohlížečAnoAnoHoneycomb (3.x) for tablets and Ice Cream Sandwich (4.x) for phones2011
Firefox for AndroidWebový prohlížeččástečněPodporováno při prohlížení. Synchronozace a další nepodporují SNI[27][28]
wgetCommand-line toolAnoAnoOd verze 1.142012
Nokia Browser for SymbianWebový prohlížečNeNe
Opera Mobile for SymbianWebový prohlížečNeNeNení podporováno na Series60
DilloWebový prohlížečAnoAnoOd verze 3.12016
IBM HTTP ServerWebový serverAnoAnoOd verze 9.0.0[29][30]
Apache TomcatWebový serverAnoAnoNení podporováno před 8.5 (backport na 9)
Apache HTTP ServerWebový serverAnoAnoOd verze 2.2.122009
Microsoft IISWebový serverAnoAnoOd verze 82012
nginxWebový serverAnoAnoOd verze 0.5.232007
JettyWebový serverAnoAnoOd verze 9.3.02015
HCL DominoWebový serverAnoAnoOd verze 11.0.12020
QtLibraryAnoAnoOd verze 4.82011
Mozilla NSS server sideLibraryNeNe[31]
4th DimensionLibraryNeNeNení podporováno in 15.2 or earlier
JavaLibraryAnoAnoOd verze 1.72011
ColdFusion / LuceeLibraryAnoAnoColdFusion Od verze 10 Update 18, 11 Update 7, Lucee Od verze 4.5.1.019, Version 5.0.0.502015
ErlangLibraryAnoAnoOd verze r172013
GoLibraryAnoAnoOd verze 1.42011
PerlLibraryAnoAnoSince Net::SSLeay version 1.50 and IO::Socket::SSL version 1.562012
PHPLibraryAnoAnoOd verze 5.32014
PythonLibraryAnoAnoPodporová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
RubyLibraryAnoAnoOd verze 2.0 (in net/http)2011
HiawathaWebový serverAnoAnoOd verze 8.62012

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
  • GNU TLS[37]

Nepodporované operační systémy a prohlížeče

Následující kombinace nepodporují SNI

Knihovny

Odkazy

Reference

  1. a b SNI extension feature and HTTPS blocking. Web Filter [online]. [cit. 2023-11-25]. Dostupné online. 
  2. a b Web Filtering. Sophos UTM Administrator Guide [online]. [cit. 2023-11-25]. Dostupné online. 
  3. a b SHBAIR, Wazen. Efficiently Bypassing SNI-based HTTPS Filtering [online]. 2015-12-03 [cit. 2023-11-25]. Dostupné online. 
  4. 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) 
  5. a b GHEDINI, Alessandro. Encrypt it or lose it: how encrypted SNI works [online]. 2018-09-24 [cit. 2021-07-11]. Dostupné online. (anglicky) 
  6. a b Make ESNI TLS 1.2 compatible · Issue #38 · tlswg/draft-ietf-tls-esni [online]. [cit. 2020-08-09]. Dostupné online. 
  7. a b WYMAN, Alice. Encrypted Client Hello (ECH) - Frequently asked questions. Firefox Help [online]. [cit. 2023-11-25]. Dostupné online. 
  8. CAcert VHostTaskForce [online]. [cit. 2009-11-03]. (CAcert Wik). Dostupné v archivu pořízeném dne 2009-08-22. 
  9. 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) 
  10. 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) 
  11. 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) 
  12. EdelKey Project [online]. [cit. 2009-11-03]. Dostupné v archivu pořízeném dne 2016-04-04. 
  13. CHANG, Kershaw. 1667743 - Clean up unused esni code. bugzilla.mozilla.org [online]. 2020-09-28 [cit. 2023-11-27]. Dostupné online. (anglicky) 
  14. Encrypt it or lose it: how encrypted SNI works. The Cloudflare Blog [online]. 2018-09-24 [cit. 2023-11-27]. Dostupné online. (anglicky) 
  15. Make ESNI TLS 1.2 compatible · Issue #38 · tlswg/draft-ietf-tls-esni. GitHub [online]. [cit. 2023-11-27]. Dostupné online. (anglicky) 
  16. RESCORLA, Eric. TLS Encrypted Client Hello. tlswg.org [online]. [cit. 2023-11-27]. Dostupné online. (anglicky) 
  17. 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) 
  18. 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) 
  19. 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) 
  20. 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) 
  21. Почему Ростелеком блокирует ESNI трафик?. Хабр Q&A — вопросы и ответы [online]. 2020-10-11 [cit. 2023-11-27]. Dostupné online. (rusky) 
  22. WYMAN, Alice. Understand Encrypted Client Hello (ECH). Firefox Help [online]. 2023-09-26 [cit. 2023-11-25]. Dostupné online. 
  23. 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) 
  24. 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) 
  25. CAcert VHostTaskForce [online]. [cit. 2008-10-27]. Dostupné v archivu pořízeném z originálu dne 22 August 2009. 
  26. https://repo.or.cz/alpine.git/commit/08fcd1b86979b422eb586e56459d6fe15333e500
  27. Bug 765064 — HttpClient in use by Sync and other services doesn't support SNI [online]. 29 October 2017 [cit. 2017-11-09]. Dostupné online. 
  28. Bug 1412650 — Switch services.* code to use HttpsURLConnection [online]. 29 October 2017 [cit. 2017-11-09]. Dostupné online. 
  29. IBM HTTP Server SSL Questions and Answers [online]. IBM [cit. 2011-03-08]. Dostupné online. 
  30. 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. 
  31. Bug 360421 — Implement TLS Server Name Indication for servers [online]. 11 November 2006 [cit. 2012-10-30]. Dostupné online. 
  32. Bug 34607: Support for Server Name Indication [online]. Apache Software Foundation. Dostupné online. 
  33. Revision 776281: adding support for Server Name Indication to the Apache 2.2.x branch [online]. Apache Software Foundation. Dostupné online. 
  34. CHANGES: Server Name Indication support is listed under the changes for Apache 2.2.12 [online]. Apache Software Foundation. Dostupné online. 
  35. #386 (TLS servername extension (SNI) for namebased TLS-vhosts) - lighttpd - Trac
  36. Ř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. 
  37. Server name indication (GnuTLS 3.6.2). www.gnutls.org [online]. [cit. 2018-07-13]. Dostupné online. 
  38. Bug 122433 - Server Name Identification support
  39. 188841 - It would be useful if QSslSocket supports TLS extensions such as Server Name Indication as per RFC 3546[nedostupný zdroj]
  40. Qt Patch and merge request. qt.gitorious.org [online]. [cit. 2009-11-03]. Dostupné v archivu pořízeném dne 2009-11-09. 
  41. NSS Roadmap (as of 11 September 2009)
  42. 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

Média použitá na této stránce

Symbol confirmed.svg
A green check symbol.
Symbol delete vote darkened.svg
cancel symbol dark red