Server Name Indication (SNI) ist eine TLS-Protokollerweiterung, die es einem Client ermöglicht, den Ziel-Hostnamen als Teil der ClientHello-Nachricht zu Beginn des TLS-Handshakes zu senden, bevor der Server sein Zertifikat übermittelt. Dies löst das Problem des namensbasierten Virtual Hosting für HTTPS — mehrere Domains mit unterschiedlichen Zertifikaten können nun eine einzelne IP-Adresse nutzen.
Ohne SNI könnte ein Server nicht wissen, welches Zertifikat er präsentieren soll, bis er die TLS-Handshake-Anfrage gelesen hat; mit SNI ist der Hostname in Klartext früh sichtbar, sodass der Server das richtige SSL-Zertifikat für diese Domain auswählt und zurückgibt. Dies wurde entscheidend, als die HTTPS-Adoption skalierte und IPv4-Adressen knapp wurden.
Beispiel: Eine Server-IP hostet sowohl example.com als auch example.org. Wenn ein Client sich mit example.org verbindet, fügt er server_name = example.org in die ClientHello ein. Der Server liest dies und antwortet mit dem Zertifikat für example.org statt mit einem Standard- oder unpassenden Zertifikat.
WarningSNI wird in Klartext in der ClientHello gesendet — der Hostname ist für Netzwerk-Beobachter, Firewalls und ISPs sichtbar, obwohl der Rest der Sitzung verschlüsselt ist. Dies ermöglicht hostnamenbasierte Zensur trotz HTTPS. Encrypted Client Hello (ECH), eine geplante TLS-Erweiterung, zielt darauf ab, SNI in Zukunft zu verschlüsseln, aber die Adoption entwickelt sich noch.
Legacy-TLS-Clients (Windows XP, Android <2.3, altes Java) unterstützen SNI nicht und schlagen bei der Zertifikatvalidierung bei Shared-IP-Multi-Domain-Hosting fehl. Moderne Clients, Browser und Systeme unterstützen SNI seit Mitte der 2000er Jahre. SNI ist in RFC 6066 definiert und wurde unverändert in TLS 1.3 übernommen.