Server Name Indication

rozšíření protokolu TLS umožňující poskytování více https webů na jedné IP adrese/portu

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

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

HistorieEditovat

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.

PodporaEditovat

Podpora prohlížečůEditovat

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

ServeryEditovat

  • 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]

KnihovnyEditovat

  • 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čeEditovat

Následující kombinace nepodporují SNI

KnihovnyEditovat

ReferenceEditovat

  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