Server Name Indication

Z Wikipedie, otevřené encyklopedie

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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í[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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é.

Historie[editovat | editovat zdroj]

SNI bylo uvedeno v roce 2003 v RFC 3546. V roce 2004 projekt EdelKey[10] 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.[11]

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.[12][13] Při podpoře protokolu ECH nesmí klient pro komunikaci navrhovat nižší verzi TLS protokolu než 1.3.[14]

V srpnu 2020 začal Velký Čínský firewall blokovat provoz s ESNI, ale ECH zůstal povolen.[15] 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.[16][17][18] V říjnu 2020 začal ruský ISP a jeho mobilní operátor Tele2 blokovat provoz s ESNI.[19]

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)[20][21] a je podporován webhostingem Cloudfare.[22]

Podpora prohlížečů[editovat | editovat zdroj]

Podpora SNI[23]
Software Typ Podporováno Poznámky Podporováno od
Alpine (email client) IMAP email client AnoAno Od verze 2.22[24] 2019-02-18
Internet Explorer Webový prohlížeč AnoAno Od verze 7 on Vista (Není podporováno na XP) 2006
Edge Webový prohlížeč AnoAno Všechny verze
Mozilla Firefox Webový prohlížeč AnoAno Od verze 2.0 2006
cURL Command-line tool and library AnoAno Od verze 7.18.1 2008
Safari Webový prohlížeč AnoAno Není podporováno na Windows XP
Google Chrome Webový prohlížeč AnoAno 2010
BlackBerry 10 Webový prohlížeč AnoAno 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č AnoAno 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[25][26]
wget Command-line tool AnoAno Od verze 1.14 2012
Nokia Browser for Symbian Webový prohlížeč NeNe
Opera Mobile for Symbian Webový prohlížeč NeNe Není podporováno na Series60
Dillo Webový prohlížeč AnoAno Od verze 3.1 2016
IBM HTTP Server Webový server AnoAno Od verze 9.0.0[27][28]
Apache Tomcat Webový server AnoAno Není podporováno před 8.5 (backport na 9)
Apache HTTP Server Webový server AnoAno Od verze 2.2.12 2009
Microsoft IIS Webový server AnoAno Od verze 8 2012
nginx Webový server AnoAno Od verze 0.5.23 2007
Jetty Webový server AnoAno Od verze 9.3.0 2015
HCL Domino Webový server AnoAno Od verze 11.0.1 2020
Qt Library AnoAno Od verze 4.8 2011
Mozilla NSS server side Library NeNe [29]
4th Dimension Library NeNe Není podporováno in 15.2 or earlier
Java Library AnoAno Od verze 1.7 2011
ColdFusion / Lucee Library AnoAno ColdFusion Od verze 10 Update 18, 11 Update 7, Lucee Od verze 4.5.1.019, Version 5.0.0.50 2015
Erlang Library AnoAno Od verze r17 2013
Go Library AnoAno Od verze 1.4 2011
Perl Library AnoAno Since Net::SSLeay version 1.50 and IO::Socket::SSL version 1.56 2012
PHP Library AnoAno Od verze 5.3 2014
Python Library AnoAno 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 AnoAno Od verze 2.0 (in net/http) 2011
Hiawatha Webový server AnoAno Od verze 8.6 2012

Servery[editovat | editovat zdroj]

  • Apache 2.2.12 nebo novější s podporou mod_gnutls nebo mod_ssl[30][31][32]
  • Cherokee, jestliže je kompilovaný s TLS podporou
  • Nové verze lighttpd 1.4.x a 1.5.x[33]
  • Nginx doprovázený vestavěným OpenSSL s SNI podporou
  • Microsoft IIS 8 – Ve Windows Server 8 Beta je již podpora vazeb s SNI[34]

Knihovny[editovat | editovat zdroj]

  • NameGerson NSS
  • OpenSSL
    • 0.9.8f – zkompilované s volbou --enable-tlsext
    • verze 1.0.0 obsahuje podporu SNI
  • GNU TLS[35]

Nepodporované operační systémy a prohlížeče[editovat | editovat zdroj]

Následující kombinace nepodporují SNI

Knihovny[editovat | editovat zdroj]

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

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

Externí odkazy[editovat | editovat zdroj]

  • 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