Wikipedia · einfach zusammengefasst · Stand
Server Name Indication
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 …
Inhalt6 Abschnitte
Kernidee und Bedeutung
Server Name Indication (SNI) ist eine Erweiterung von Transport Layer Security (TLS). Sie ermöglicht, dass mehrere verschlüsselt erreichbare Websites verschiedener Domains denselben Server und dieselbe IP-Adresse am TLS-Port 443 nutzen. Dieses Verfahren heißt Virtual Hosting.
Beim Aufbau einer TLS-Verbindung fordert der Client vom Server ein digitales Zertifikat an. Das Zertifikat wird für die Verschlüsselung und zur Prüfung der Authentizität der Website benötigt. Ohne SNI würde der Server standardmäßig das Zertifikat zurücksenden, das mit seiner IP-Adresse verbunden ist. Bei mehreren Websites mit unterschiedlichen Zertifikaten wüsste er daher nicht, welches Zertifikat verwendet werden soll.
SNI löst dieses Problem, indem der Client den gewünschten Hostnamen bereits beim Verbindungsaufbau im Parameter server_name mitteilt. Der Server kann dadurch das passende Zertifikat auswählen und im TLS-Handshake verwenden.
Hintergrund
Nutzer überprüfen die Authentizität einer Website in der Regel mithilfe digitaler Zertifikate. Bei TLS-1.0 beziehungsweise SSL wird der verschlüsselte Verbindungsaufbau jedoch bereits gestartet, bevor die angeforderte URL übertragen wird. Deshalb war Virtual Hosting mit mehreren Zertifikaten zunächst nicht möglich.
Die ursprüngliche Spezifikation von SSL/TLS sah die Möglichkeit, mehrere Hosts mit verschiedenen Zertifikaten unter einer IP-Adresse zu betreiben, nicht vor. Das zentrale Problem bestand darin, dass der Server vor der Zertifikatsübermittlung den gewünschten Host nicht kannte.
Verfahren und Zertifikate
Im erweiterten SNI-Verfahren übermittelt der Browser den Domainnamen beim Aufbau der Verbindung im server_name-Parameter. Diese Information wird vor dem Aufbau des verschlüsselten Kanals übertragen. Der Server nutzt sie, um das passende Zertifikat für den TLS-Handshake auszuwählen.
Für mehrere Namen gibt es verschiedene Zertifikatsarten:
- Ein Wildcard-Zertifikat mit einem kanonischen Namen wie *.wikipedia.org umfasst beliebige Namen innerhalb einer Domain.
- Ein Zertifikat kann auch alternative Namen für mehrere Domains enthalten.
Für Wildcard-Zertifikate und Zertifikate mit alternativen Namen verlangen Zertifikatsanbieter allerdings höhere Gebühren.
Sicherheits- und Datenschutzaspekte
Der server_name-Parameter wird unverschlüsselt übertragen. Ein Dritter, der die Verbindung belauscht, kann den angeforderten Hostnamen daher leicht ausspähen. SNI kann dadurch mehr Informationen offenlegen als SSL/TLS ohne SNI: Das anschließend übertragene Server-Zertifikat enthält zwar ebenfalls die Domain oder Domains, für die es ausgestellt wurde, aber bei einem Zertifikat für mehrere Domains oder einem Wildcard-Zertifikat lässt sich ohne SNI möglicherweise nicht der vollständige angeforderte Hostname erkennen.
Encrypted SNI (ESNI) und sein Nachfolger Encrypted Client Hello (ECH) sind Ansätze, dieses Problem zu lösen. Unabhängig von SSL/TLS und HTTP können Dritte die abgefragte Domain außerdem über die DNS- beziehungsweise DNSSEC-Auflösung erfahren. Der vollständige Domainname einschließlich Subdomain wird dabei meistens unverschlüsselt übertragen. DNS over TLS und DNS over HTTPS sollen dieses Problem verringern.
Bei vielen, insbesondere größeren Websites ist eine Zuordnung auch über die aufgerufene IP-Adresse möglich, da diese systembedingt nicht verschlüsselt werden kann. Bei mittelgroßen Websites ist eine solche Zuordnung zumindest für Subdomains nicht möglich, wenn diese auf demselben Server liegen. Die Nutzung eines VPN kann das Problem abmildern.
Unterstützte Software
SNI wird von den meisten verbreiteten Browsern, Webservern und Programmbibliotheken unterstützt. Bei Browsern gilt unter anderem: Firefox unterstützt SNI ab Version 2.0 (2006), Chrome ab 6.0 (2010), Internet Explorer ab Version 7 unter Windows Vista (2006), Microsoft Edge seit 2015, Opera ab Version 8.0 (2005), Safari ab Version 3.2.1 unter Mac OS X Leopard 10.5.6 oder Windows Vista (2008), Android Browser ab Honeycomb 3.x für Tablets und Ice Cream Sandwich 4.x für Smartphones (2011), Blackberry OS ab Version 10 (2013), Windows Phone ab Version 7 (2010) und Safari auf iOS seit iOS 4 (2010). Firefox Mobile unterstützt SNI teilweise, da Firefox Sync kein SNI unterstützt. Nokia Browser for Symbian und ELinks unterstützen es nicht; ELinks nicht bis Version 0.12pre6. Mini & MobilOperae unterstützen SNI ab Version 10.1 auf Android (2010).
Unter den Webservern unterstützen IBM HTTP Server SNI ab Version 9.0.0 (2016), Apache Tomcat ab 8.5 (2016), Apache HTTP Server ab 2.2.12 (2009), Microsoft IIS ab Version 8 (2012), Lighttpd ab Version 1.4.24 oder mit SNI-Patch (2009), Nginx ab Version 0.5.23 (2007), Jetty ab Version 9.3.0 (2015), HCL Domino ab Version 11.0.1 (2020), Hiawatha ab Version 8.6 (2012) und OpenBSD httpd seit OpenBSD Version 6.1 (11.04.2017).
Unterstützt wird SNI außerdem von cURL ab Version 7.18.1 (2008), wget ab 1.14 (2012), Qt ab 4.8 (2011), Java ab 1.8 (2014), ColdFusion ab Version 10 Update 18 beziehungsweise 11 Update 7, Lucee ab Version 4.5.1.019 beziehungsweise 5.0.0.50 (2015), Erlang ab r17 (2013), Go ab 1.4 (2011), Perl seit Net::SSLeay 1.50 und IO::Socket::SSL 1.56 (2012), PHP ab 5.3 (2014), Python ab 2.7.9rc1 und 3.2alpha4 (2011 für 3.x, 2014 für 2.x) sowie Ruby ab 2.0 in net/http (2011). Mozilla NSS server side und 4th Dimension unterstützen SNI nicht; 4th Dimension nicht bis Version 15.2.
Normen und Standards
SNI war zunächst eine optionale Protokollerweiterung ab TLS 1.0 von 1999. Die Erweiterung wurde zuerst in RFC 3546, Transport Layer Security (TLS) Extensions, aus dem Jahr 2003, Abschnitt 3.1, standardisiert. Dieser RFC ist veraltet.
Die maßgebliche Spezifikation ist RFC 6066, Transport Layer Security (TLS) Extensions: Extension Definitions, aus dem Jahr 2011, Abschnitt 3: Server Name Indication. Seit TLS 1.3 gehört SNI zum Grundfunktionsumfang von TLS. RFC 8446 aus dem Jahr 2018 verweist für die Detailspezifikation von SNI auf RFC 6066.