Server Name Indication

Z Wikipedie, otevřené encyklopedie
Skočit na navigaci Skočit na vyhledávání

Server Name Indication (zkratka SNI) je v informatice metoda, jak obejít nedostatek v protokolu SSL v2, který neumožňuje při přístupu přes HTTPS vytvářet virtuální webové servery – tj. více různých doménových jmen umístěných na jedné IP adrese (využívá se při webhostingu). Pomocí SNI může klient před výměnou šifrovacích klíčů nejprve sdělit jméno požadovaného webového serveru a server tak může vybrat příslušný šifrovací klíč požadovaného virtuálního serveru.

Popis problému[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č). Každý požadavek klienta je vyřízen tak, že jsou mu odeslána nějaká data (webová stránka, obrázek, zvuk…). Žádosti i odpovědi jsou realizovány pomocí protokolu HTTP.

U 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. V následující verzi byla do protokolu HTTP přidána podpora tzv virtuálních serverů, kdy je klient schopen sdělit serveru v rámci protokolu HTTP doménové jméno (v položce Host: v záhlaví 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 jednoduše tak, že se všechna přenášená data zašifrují pomocí SSL nebo TLS. V tomto okamžiku však vzniká problém, protože připojí-li se klient k webovému serveru pomocí HTTPS, dojde ihned na začátku komunikace mezi klientem a serverem k výměně šifrovacích klíčů, které však obsahují i identifikaci serveru, jako je doménové jméno, majitel, adresa, digitální podpis, atd. (viz digitální certifikát a PKI). Veškerá následující komunikace je tedy již zašifrována, avšak teprve pak je klient pomocí protokolu HTTP schopen serveru sdělit, z jakého virtuálního serveru by chtěl data získat. Šifrované spojení je již však navázáno, klíče není možné změnit a klient musí ohlásit, že se neshodují údaje v certifikátu s doménovým jménem serveru uvedeným v URL požadované stránky.

Proto musí každý webový server, který chce využívat HTTPS, mít svoji vlastní IP adresu. Chceme-li však používat s protokolem HTTPS virtuální webové servery (stejně jako u HTTP), je nutné použít zde popsané SNI (na jediné IP adrese pak mohou být webové servery s různými doménovými jmény).

Historie[editovat | editovat zdroj]

V roce 2005 se zjistilo, že není jednoduchý způsob jak upgradovat SSL v2 na TLS[1], proto internetové stránky musely aktualizovat svůj software. Mozilla oznámila kompletní ukončení podpory SSL v2[2] v nové verzi Firefoxu. Společnost Firefox potom přesvědčila majitele zbylých 2000 stránek, aby aktualizovaly jejich servery na SSL v3 nebo TLS v1.

Od roku 2005, Certifikační autorita (CA) začala experimentovat s různými způsoby užívání TLS na virtuálních serverech.[3] Většina experimentů byla dosud ovšem neuspokojivých, nebo velice nepraktických. Například je možné použít Alternativního názvu předmětu pro obsažení více domén v jediném certifikátu, 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 musí být potom při každé změně seznamu domén znovu vydán.

V roce 2004 projekt EdelKey[4] vytvořil patch pro TLS/SNI do OpenSSL. Následně v roce 2006 byl tento patch použit ve vývojové větvi OpenSSL a v roce 2007 opět využit pro OpenSSL 0.9.8. EdelKey také začal vyvíjel patch pro Apache HTTP Server a ten dnes TLS/SNI podporuje s moduly gnutls a ssl.

Podpora[editovat | editovat zdroj]

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

Podpora SNI[5]
Software Typ Podporováno Poznámky Podporováno od
Alpine (email client) IMAP email client AnoAno Od verze 2.22[6] 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[7][8]
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[9][10]
Apache Tomcat Webový server AnoAno Není podporováno přeed 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 [11]
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[12][13][14]
  • Cherokee, jestliže je kompilovaný s TLS podporou
  • Nové verze lighttpd 1.4.x a 1.5.x[15]
  • Nginx doprovázený vestavěným OpenSSL s SNI podporou
  • Microsoft IIS 8 – Ve Windows Server 8 Beta je již podpora vazeb s SNI[16]

Knihovny[editovat | editovat zdroj]

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

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

Následující kombinace nepodporují SNI

Knihovny[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

  1. TLS Server Name Indication [online]. (Paul’s Journal). Dostupné online. 
  2. MARKHAM, Gervase. SSL2 must die: help wanted [online]. Dostupné online. 
  3. CAcert VHostTaskForce [online]. [cit. 2009-11-03]. (CAcert Wik). Dostupné v archivu pořízeném dne 2009-08-22. 
  4. EdelKey Project [online]. Dostupné online. 
  5. CAcert VHostTaskForce [online]. [cit. 2008-10-27]. Dostupné v archivu pořízeném z originálu dne 22 August 2009. (anglicky) 
  6. https://repo.or.cz/alpine.git/commit/08fcd1b86979b422eb586e56459d6fe15333e500
  7. Bug 765064 — HttpClient in use by Sync and other services doesn't support SNI [online]. 29 October 2017 [cit. 2017-11-09]. Dostupné online. (anglicky) 
  8. Bug 1412650 — Switch services.* code to use HttpsURLConnection [online]. 29 October 2017 [cit. 2017-11-09]. Dostupné online. (anglicky) 
  9. IBM HTTP Server SSL Questions and Answers [online]. IBM [cit. 2011-03-08]. Dostupné online. (anglicky) 
  10. 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. (anglicky) 
  11. Bug 360421 — Implement TLS Server Name Indication for servers [online]. 11 November 2006 [cit. 2012-10-30]. Dostupné online. (anglicky) 
  12. Bug 34607: Support for Server Name Indication [online]. Apache Software Foundation. Dostupné online. 
  13. Revision 776281: adding support for Server Name Indication to the Apache 2.2.x branch [online]. Apache Software Foundation. Dostupné online. 
  14. CHANGES: Server Name Indication support is listed under the changes for Apache 2.2.12 [online]. Apache Software Foundation. Dostupné online. 
  15. #386 (TLS servername extension (SNI) for namebased TLS-vhosts) - lighttpd - Trac
  16. Ř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. 
  17. Server name indication (GnuTLS 3.6.2). www.gnutls.org [online]. [cit. 2018-07-13]. Dostupné online. 
  18. Bug 122433 - Server Name Identification support
  19. 188841 - It would be useful if QSslSocket supports TLS extensions such as Server Name Indication as per RFC 3546[nedostupný zdroj]
  20. Qt Patch and merge request. qt.gitorious.org [online]. [cit. 2009-11-03]. Dostupné v archivu pořízeném dne 2009-11-09. 
  21. NSS Roadmap (as of 11 September 2009)
  22. Support TLS SNI extension in ssl module