Server Name Indication (SNI)
Diese Anleitung beschreibt, wie man „namensbasierte virtuelle Hosts“ gemeinsam mit SSL nutzen kann. Sie erfordert einen Apache Webserver auf dem ModSSL eingerichtet ist. Wie man so etwas macht kann man z.B. hier nachlesen. Die Aussage, das nur 1 Zertifikat pro IP funktioniert ist mittlerweile, dank SNI, veraltet.
Voraussetzungen für SNI
Server
-
Apache 2.2.12 oder neuer
-
OpenSSL 0.9.8f oder neuer
Hinweis: Es können auch andere Webserver SNI. Hier geht es aber um die Apache Konfiguration.
Ubuntu
Bei der Ubuntu-Version 06.06 LTS ist die Apache Version zu alt. Bei Ubuntu 10.04 LTS sind die Versionen neu genug.
Clients (Browser)
-
Mozilla Firefox 2.0 oder neuer
-
Opera 8.0 oder neuer (mit TLS 1.1 eingeschaltet)
-
Internet Explorer 7.0 oder neuer (nur unter Vista, nicht unter Windows XP)
-
Google Chrome
-
Safari 3.2.1 unter Mac OS X 10.5.6 oder neuer
Zertifikate erstellen
-
Zuerst muss mit OpenSSL ein privater Schlüssel erstellt werden.
1openssl genrsa -out private.key 4096 -
Danach muss ein certificate request erstellt werden. Beim „Common Name“ muss der Domain-Name eingetragen werden.
1openssl req -new -key private.key -out crt-request.csr -
Die Antwort von der CA ist das Zertifikat, welches vom Browser überprüft wird. Dies muss z.B. als public.crt gespeichert werden.
Apache – Virtual Hosts
Grundlagen
Bei Virtuellen Hosts ist 1 PC mit 1 IP für mehrere Domains zuständig. Der Browser sagt dem Webserver, welche Domain der Nutzer anschauen möchte. Der Webserver liefert dann die entsprechende Seite aus. Dies hat vor SNI nur mit einem SSL-Zertifikat funktioniert, da der Browser erst nach dem Aufbau der verschlüsselten Verbindung die gewünschte Domain übertragen hat. Bei SNI wird die gewünschte Domain schon beim Verbindungsaufbau mit übergeben.
Konfiguration
Es muss für jede Domain ein Zertifikat angelegt werden. Die Parameter SSLCertificateFile, SSLCertificateKeyFile und SSLCACertificateFile werden unterhalb von virtualhost konfiguriert. Somit kann für jeden VirtualHost ein eigenes Zertifikat benutzt werden.
Beispiel-Konfiguration mit 2 Domains
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
NameVirtualHost *:80 NameVirtualHost *:443 #Domain 1 ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/example.com/ ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/example.com/ SSLEngine On SSLCertificateFile /etc/ssl/private/example.com.crt SSLCertificateKeyFile /etc/ssl/private/example.com.key SSLCACertificateFile /etc/ssl/certs/cacert.org.pem SSLVerifyClient none #Domain 2 ServerName example.org ServerAlias www.example.org DocumentRoot /var/www/example.org/ ServerName example.org ServerAlias www.example.org DocumentRoot /var/www/example.org/ SSLEngine On SSLCertificateFile /etc/ssl/private/example.org.crt SSLCertificateKeyFile /etc/ssl/private/example.org.key SSLCACertificateFile /etc/ssl/certs/cacert.org.pem SSLVerifyClient none |
Wildcard Zertifikate
Bei einem Wildcard Zertifikat ist der „Common Name“ nicht nur eine Domain (z.B.: www.thju.de) sondern beinhaltet alle SubDomains. Der „Common Name“ beginnt mit einem * (z.B.: „*.thju.de“). Das Zertifikat funktioniert leider nicht für die eigentliche Domain (https://thju.de). Dies kann mit einem 2. Zertifikat oder mit einer Weiterleitung zu https://www.thju.de umgangen werden.
Die Zertifizierungsstelle muss die Wildcard Zertifikate unterstützten. CaCert unterstützt solche Zertifikate.
Fehler / Probleme
Es werden falsche Zertifikate ausgeliefert
Beim Testen/Rumspielen mit unterschiedlichen Zertifikaten hatte ich das Problem, das falsche bzw. Zertifikate von vorherigen Konfigurationen ausgeliefert wurden. Wenn man der Meinung ist, das alles richtig Eingestellt ist und trotzdem noch Flasche Zertifikate ausgeliefert werden, sollte die folgenden 3 Dinge tun.
-
Browser Neustarten
-
Apache Webserver neu Starten
-
Den kompletten Server neu Starten (Bei mir kam es vor, das nach Schritt 1+2 immer noch falsche Zertifikate ausgeliefert wurden. Ein Neustart des Servers hat da geholfen. Vermutlich lag das an einem SSL-Cache oder sonstigem Caching)
-
Den Client-PC (Browser) Neustarten (Cache können Nerven)
Quellen
http://de.wikipedia.org/wiki/Server_Name_Indication
http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI
http://httpd.apache.org/docs/2.2/de/vhosts/name-based.html
Hinweis: Teile von dieser Seite sind selbst geschrieben, andere Teile sind aus den genannten Quellen kopiert oder übersetzt.
PS: Die selbstgeschrieben Teile sind an der schlechten Grammatik und an den vielen Rechtschreibfehlern zu erkennen.
Leave a Reply
You must be logged in to post a comment.