Server Name Indication
Server Name Indication (SNI) ist eine Erweiterung des Standards Transport Layer Security (TLS), die es ermöglicht, dass sich mehrere verschlüsselt abrufbare Websites unterschiedlicher Domains einen Server auf dem TLS Port 443 teilen, auch wenn dieser nur eine IP-Adresse besitzt. Beim Aufbau einer TLS-Verbindung fordert der Client, der die Verbindung aufgebaut hat, vom Server ein digitales Zertifikat an, welches für die Verschlüsselung der Verbindung benötigt wird. Der Server sendet standardmäßig das mit seiner IP-Adresse verbundene Zertifikat zurück. Um unter einer IP-Adresse aber einen Server für verschiedene Hosts mit verschiedenen Zertifikaten zu betreiben, ist es erforderlich, dass der Client dem Server den gewünschten Host vor der Übermittlung des Zertifikats, also bevor über die Verbindung ein verschlüsselter Kanal aufgebaut wurde, mitteilt. SNI ist eine Erweiterung von TLS, die es dem Client erlaubt, diese Information unverschlüsselt zu übertragen.
Hintergrund
Um als Nutzer die Authentizität einer Webseite im Internet zu überprüfen, verwendet man in der Regel digitale Zertifikate. Da der verschlüsselte Verbindungsaufbau zum Server bereits stattfindet, bevor die angefragte URL übertragen wird, ist es mit TLS-1.0/SSL-Verschlüsselung nicht möglich, mehrere Domains unter einer IP-Adresse zu nutzen (sogenanntes Virtual Hosting). Grund für diese Einschränkung ist, dass der Server bei mehreren Zertifikaten nicht weiß, welches Zertifikat, das meist nur für eine Domain gilt, er benutzen müsste. Zum Zeitpunkt der Spezifikation von SSL/TLS wurde die Möglichkeit von Virtual Hosting nicht vorgesehen.
Verfahren
Im erweiterten SNI-Verfahren wird der Domainname vom Browser in dem sogenannten server_name-Parameter bereits beim Verbindungsaufbau dem Server mit übergeben, sodass der Server das passende Zertifikat auswählen und beim TLS-Handshake verwenden kann.
Sogenannte „Wildcard-Zertifikate“ mit einem Kanonischen Namen wie hier *.wikipedia.org umfassen beliebige Namen in einer Domain. Ein Zertifikat kann auch alternative Namen umfassen.[1] Zertifikatsanbieter verlangen für solche Zertifikate allerdings höhere Gebühren.
Sicherheit
Der server_name-Parameter wird unverschlüsselt übertragen und ist somit von einem Dritten, der die Verbindung belauschen kann, leicht auszuspähen. Dies verrät unter Umständen mehr Informationen als SSL/TLS ohne SNI, da das anschließend übertragene Server-Zertifikat ebenfalls die Domain(s), für die es ausgestellt wurde, im Klartext enthält. Wenn das Zertifikat für mehrere Domains gültig oder ein Wildcard-Zertifikat ist, würde der Ausspähende ohne SNI nicht den kompletten angeforderten Hostnamen erfahren. Mit ESNI (Encrypted SNI) und seinem Nachfolger ECH (Encrypted Client Hello) gibt es Ansätze, dieses Problem zu lösen.[2]
Unabhängig von SSL/TLS und HTTP können Dritte auch die abgefragte Domain in Erfahrung bringen, da zum Verbindungsaufbau die Domain mittels DNS bzw. DNSSEC aufgelöst werden muss. Der vollständige Domainname (also inklusive Subdomain) wird dabei meistens unverschlüsselt übertragen. Mit DNS over TLS oder DNS over HTTPS gibt es Ansätze, dieses Problem zu lösen.
Bei vielen, vor allem größeren Websites ist zudem eine Rückführung über die aufgerufene IP-Adresse möglich, da diese systembedingt nicht verschlüsselt werden kann. Bei mittelgroßen Websites ist dieses aber zumindest nicht für Subdomains möglich, sofern diese auf demselben Server liegen. Darüber hinaus kann dieses Problem durch die Verwendung eines VPN abgemildert werden.
Unterstützte Software
Software | Typ | Unterstützt | Bemerkungen | Unterstützt seit |
---|---|---|---|---|
Firefox | Web Browser | ja | Ab Version 2.0[3] | 2006 |
Chrome | Web Browser | ja | Seit 6.0[3][4] | 2010 |
Internet Explorer | Web Browser | ja | Ab Version 7 ab Windows Vista[3] | 2006 |
Microsoft Edge | Web Browser | ja | 2015 | |
Opera | Web Browser | ja | Ab Version 8.0[3] | 2005 |
Safari | Web Browser | ja | Ab Version 3.2.1 ab Mac OS X Leopard 10.5.6 oder Windows Vista[3] | 2008 |
ELinks | Web Browser | nein | Nicht bis Version 0.12pre6 | |
Android Browser | Mobile Browser | ja | Honeycomb (3.x) für Tablets und Ice Cream Sandwich (4.x) für Smartphones[5] | 2011 |
Mozilla Firefox Mobile | Mobile browser | teils | Firefox Sync unterstützt kein SNI[6] | |
Blackberry OS | Mobile Browser | ja | Ab Version 10 | 2013 |
Windows Phone | Mobile Browser | ja | Ab Version 7[7] | 2010 |
Nokia Browser for Symbian | Mobile Browser | nein | ||
Safari auf iOS | Mobile Browser | ja | Seit iOS 4[8] | 2010 |
(Mini & MobilOperae) | Mobile Browser | ja | Ab Version 10.1 auf Android | 2010 |
IBM HTTP Server | Web Server | ja[9][10] | Ab Version 9.0.0 | 2016 |
Apache Tomcat | Web Server | ja | Ab Version 8.5 | 2016 |
Apache HTTP Server | Web Server | ja | Ab Version 2.2.12 | 2009 |
Microsoft IIS | Web Server | ja | Ab Version 8 | 2012 |
Lighttpd | Web Server | ja | Ab Version 1.4.24[11], oder mit SNI-Patch[12] | 2009 |
Nginx | Web Server | ja | Ab Version 0.5.23 | 2007 |
Jetty | Web Server | ja | Ab Version 9.3.0 | 2015 |
HCL Domino | Web Server | ja | Ab Version 11.0.1 | 2020 |
Hiawatha | Web Server | ja | Ab Version 8.6[13] | 2012 |
cURL | Kommandozeilen Tool und Bibliothek | ja | Ab Version 7.18.1 | 2008 |
wget | Kommandozeilen Tool | ja | Ab Version 1.14 | 2012 |
Qt | Bibliothek | ja | Ab Version 4.8 | 2011 |
Mozilla NSS server side | Bibliothek | nein[14] | ||
4th Dimension | Bibliothek | nein | Nicht bis Version 15.2 | |
Java | Bibliothek | ja | Ab Version 1.8 | 2014 |
ColdFusion / Lucee | Bibliothek | ja | ColdFusion ab Version 10 Update 18, 11 Update 7, Lucee ab Version 4.5.1.019, Version 5.0.0.50 | 2015 |
Erlang | Library | ja | Ab Version r17 | 2013 |
Go | Bibliothek | ja | Ab Version 1.4 | 2011 |
Perl | Bibliothek | ja | Seit Net::SSLeay Version 1.50 und IO::Socket::SSL Version 1.56 | 2012 |
PHP | Bibliothek | ja | Ab Version 5.3 | 2014 |
Python | Bibliothek | ja | Ab Version 2.7.9rc1 (2.x) und 3.2alpha4 (3.x) (in ssl , urllib[2] und httplib ) | 2011 (3.x), 2014 (2.x) |
Ruby | Bibliothek | ja | Ab Version 2.0 (in net/http ) | 2011 |
OpenBSD httpd | Web Server | ja | Seit OpenBSD Version 6.1[15] | 11.04.2017 |
Normen und Standards
Anfänglich war Server Name Indication (SNI) eine optionale Protokollerweiterung ab TLS 1.0 von 1999 und in folgenden Request for Comments (RFC) standardisiert:
- RFC 3546 Transport Layer Security (TLS) Extensions, Kapitel 3.1 [2003, veraltet]
- RFC 6066 Transport Layer Security (TLS) Extensions: Extension Definitions, Kapitel 3 [2011, aktuell]
Seit TLS 1.3 (RFC 8446 von 2018) gehört SNI zum Grundfunktionsumfang von TLS, wobei dieser RFC zur Detailspezifikation von SNI auf RFC 6066 verweist.[16]
Weblinks
Einzelnachweise
- Does Domino HTTP allow SSL certificates with SubjectAltName? IBM, abgerufen am 2. Oktober 2016.
- TLS Encrypted Client Hello. draft-ietf-tls-esni. Internet Engineering Task Force, 12. August 2021, abgerufen am 13. August 2021 (englisch).
- Server Name Indication(SNI). IBM, abgerufen am 2. Oktober 2016.
- IIS 8 and IIS 8.5 SNI Browser Support. DigiCert. Abgerufen am 31. Dezember 2015.
- http://code.google.com/p/android/issues/detail?id=12908#c15
- https://bugzilla.mozilla.org/show_bug.cgi?id=765064
- http://blogs.msdn.com/b/kaushal/archive/2012/09/04/server-name-indication-sni-in-iis-8-windows-server-2012.aspx
- http://langui.sh/2010/06/08/sni-in-ios-4-0/
- IBM HTTP Server SSL Questions and Answers. Publib.boulder.ibm.com. Abgerufen am 8. März 2011.
- IHS 8 powered by Apache 2.2.x ?. Publib.boulder.ibm.com. Abgerufen am 8. März 2011.
- http://www.lighttpd.net/2009/10/25/1-4-24-now-with-tls-sni-and-money-back-guarantee
- #386 (TLS servername extension (SNI) for namebased TLS-vhosts)
- https://www.hiawatha-webserver.org/changelog
- Implement TLS Server Name Indication for servers. Bugzilla@Mozilla. 11. November 2006. Abgerufen am 30. Oktober 2012.
- OpenBSD 6.1 What's New. Abgerufen am 13. Juni 2021.
- Vgl. RFC 8446, Kapitel 9.2 Mandatory-to-Implement Extensions.