- Stell dir vor, du bist der Herrscher einer digitalen Festung. Deine Website lockt Besucher aus aller Welt an, und du hast mehrere majestätische Türme – eine für jeden Service, den du anbietest. Doch es gibt ein Problem: Ohne ein spezielles Sicherheitssystem könnten Angreifer mit Leichtigkeit den schwächsten Turm ins Visier nehmen. Hier kommt Server Name Indication (SNI) ins Spiel – ein unscheinbares, aber mächtiges Werkzeug, das deine digitale Festung sicherer macht.
Was ist SNI?
SNI ist eine Erweiterung des TLS-Protokolls (Transport Layer Security), die es ermöglicht, mehrere SSL/TLS-Zertifikate auf einer einzigen IP-Adresse zu verwenden. Es übergibt den Namen des Servers (also die Domain) bereits beim Verbindungsaufbau, sodass der Webserver das richtige Zertifikat für die verschlüsselte Verbindung bereitstellen kann.
Das bedeutet: Mehrere Domains können auf derselben IP-Adresse laufen, ohne Kompromisse bei der Sicherheit einzugehen.
Wo wird SNI angewandt?
SNI ist vor allem in der Welt der Webhosting-Dienste unverzichtbar. Viele Unternehmen nutzen shared Hosting, bei dem mehrere Websites auf einem einzigen Server betrieben werden. Dank SNI können all diese Websites mit ihren eigenen SSL/TLS-Zertifikaten ausgestattet werden, ohne dass für jede Domain eine separate IP-Adresse erforderlich ist.
Wie funktioniert SNI?
Wenn ein Client (z. B. ein Browser) eine Verbindung zu einer Website herstellt, sendet er normalerweise zunächst eine „ClientHello“-Nachricht, in der der Server aufgefordert wird, die Verbindung zu verschlüsseln. Ohne SNI kann der Server zu diesem Zeitpunkt nicht wissen, für welche Domain der Client ein Zertifikat erwartet. Deshalb wird ein Standardzertifikat geliefert – was zu Misstrauen führen kann.
Zum Beispiel:
Ohne SNI:
openssl s_client -connect 192.168.1.1:443
Dieser Aufruf verbindet sich mit einem Server ohne Angabe des Domainnamens. Der Server antwortet mit dem Standardzertifikat, das oft nicht mit der erwarteten Domain übereinstimmt. Dies kann zu Warnungen im Browser führen.
Mit korrekt konfiguriertem SNI:
openssl s_client -connect 192.168.1.1:443 -servername www.example.com
Hier wird der Domainname bereits im Verbindungsaufbau übergeben. Der Server erkennt, welches Zertifikat verwendet werden muss, und liefert das korrekte Zertifikat für www.example.com. Dadurch bleibt die Verbindung sicher und vertrauenswürdig.
Mit SNI hingegen übergibt der Client den Namen der gewünschten Domain bereits im „ClientHello“. Der Server kann daraufhin das korrekte Zertifikat auswählen und die Verbindung sicher herstellen.
Eine typische Konfiguration für einen Webserver, um SNI zu aktivieren, sieht folgendermaßen aus:
Für Apache:
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
</VirtualHost>
<VirtualHost *:443>
ServerName another-example.com
DocumentRoot /var/www/another-example
SSLEngine on
SSLCertificateFile /etc/ssl/certs/another-example.com.crt
SSLCertificateKeyFile /etc/ssl/private/another-example.com.key
</VirtualHost>
Für Nginx:
server {
listen 443 ssl;
server_name example.com;
root /var/www/example;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
}
server {
listen 443 ssl;
server_name another-example.com;
root /var/www/another-example;
ssl_certificate /etc/ssl/certs/another-example.com.crt;
ssl_certificate_key /etc/ssl/private/another-example.com.key;
}
Diese Konfigurationen stellen sicher, dass der Server SNI verwendet, um das richtige Zertifikat basierend auf der angeforderten Domain bereitzustellen.
Wie wird der Server Name im TLS-Protokoll übermittelt?
Im TLS-Protokoll wird der Server Name durch die Erweiterung „Server Name Indication (SNI)“ im ersten Schritt des Verbindungsaufbaus übertragen. Der Client sendet eine „ClientHello“-Nachricht, die eine Liste von unterstützten Kryptografiestandards sowie den Namen der angeforderten Domain enthält. Dieser Domainname wird im SNI-Erweiterungsfeld der Nachricht eingebettet. Der Server liest den Namen aus und wählt daraufhin das passende SSL/TLS-Zertifikat aus, um die Verbindung zu verschlüsseln. Dies geschieht, bevor der TLS-Handshake abgeschlossen ist und die eigentliche verschlüsselte Kommunikation beginnt. Dadurch kann der Server bereits zu Beginn sicherstellen, dass der richtige Hostname bedient wird.
Ein Beispiel für die „ClientHello“-Nachricht mit SNI:
Handshake Type: ClientHello
Version: TLS 1.2 (0x0303)
Random: ...
Session ID: ...
Cipher Suites: ...
Extensions:
Extension: server_name (len=14)
Type: server_name (0x0000)
Length: 14
Server Name Indication:
Hostname: www.example.com
In diesem Beispiel enthält die „ClientHello“-Nachricht im Abschnitt „Extensions“ den Domainnamen „www.example.com“, der es dem Server ermöglicht, das korrekte SSL/TLS-Zertifikat zu identifizieren.
I<aside> 💡
What if more names are communicated of the same type? Since the it is specified in the RFC that the server name field is a list
</aside>
Gefahren einer fehlenden oder falschen SNI-Konfiguration
Ohne SNI riskieren Website-Betreiber nicht nur Verwirrung bei ihren Nutzern, sondern auch schwerwiegende Sicherheitsprobleme:
- Phishing-Risiko: Angreifer könnten ein falsches Zertifikat für die Website bereitstellen, um Nutzer zur Eingabe sensibler Daten zu verleiten.
- Man-in-the-Middle-Angriffe: Ohne korrektes Zertifikat ist die Verbindung anfällig für Abhören und Manipulation.
- Vertrauensverlust: Besucher können gewarnt werden, dass die Verbindung nicht sicher ist – ein Albtraum für jedes Online-Geschäft.
Wie erkennt man mehrere Webseiten auf einem Server?
Möchte man von außen feststellen, ob auf einem Server mehrere Webseiten gehostet werden, kann man Tools wie nslookup oder dig verwenden, um die DNS-Einträge einer Domain zu analysieren. Zum Beispiel:
Mit nslookup:
nslookup www.example.com
Dies zeigt die IP-Adresse von www.example.com. Anschließend kann man überprüfen, welche weiteren Domains dieselbe IP-Adresse verwenden.
Mit dig:
dig www.example.com
Auch hier erhält man die IP-Adresse und kann diese weiter untersuchen.
Mit openssl s_client:
openssl s_client -connect www.example.com:443 -servername www.example.com
Dieser Befehl zeigt das Zertifikat der Domain an, einschließlich anderer Domains, die auf demselben Zertifikat vermerkt sind (z. B. im SAN-Feld).
Mit sslscan:
sslscan www.example.com
Dieses Tool liefert eine Liste aller von der Domain bereitgestellten Zertifikate und kann helfen, weitere gehostete Domains zu identifizieren.
Eine IP-Adresse, die mehreren Domains zugeordnet ist, deutet auf Shared Hosting hin. Mit diesen Tools lassen sich so alle Zertifikate anzeigen, die ein Server über SNI bereitstellt, und es kann nützlich sein, zu verstehen, wie viele und welche Webseiten denselben Server nutzen.
Fazit
Server Name Indication ist ein unsichtbarer Schutzschild in der Welt der Websicherheit. Es ermöglicht nicht nur die effiziente Nutzung von Ressourcen, sondern bewahrt auch das Vertrauen der Nutzer. In einer Zeit, in der Cyberangriffe immer raffinierter werden, ist SNI ein unverzichtbares Werkzeug für jeden, egal ob groß oder klein.
