Einrichten eines SSL-VHost unter Apache 2
- January 25th, 2008
- Posted in Keine Kategorie
- By Mr. Nerd
- Write comment
In vielen Fällen ist der Einsatz von SSL sinnvoll, beispielsweise beim Zugang zu internen Administrationsseiten wie phpMyAdmin. Für solche Zwecke braucht man kein teures SSL-Zertifikat erwerben, man erstellt sich einfach sein eigenes.
Aber auch für andere Dienste wie Kundenlogins sollte man besser eine verschlüsselte Verbindung nutzen. Hier ist es ratsam, auf ein kostenpflichtiges Zertifikat zurückzugreifen, da der Nutzer sonst von unverständliche Warnhinweise abgeschreckt wird.
Die folgende Anleitung erklärt, wie man einen Apache2 mit mehreren virtuellen Hosts so konfiguriert, dass er einen zusätzlichen verschlüsselten VHost bereitstellt.
Noch ein paar Hinweise vorm Start:
- Ein SSL-Host benötigt eine eigene IP-Adresse (respektive einen eigenen Port, falls man auch nicht-standard Ports nutzen möchte) und lässt sich somit NICHT mit NameVirtualHost kombinieren. Hintergrund: Die Informationen, welcher Host abgerufen werden soll sind bereits verschlüsselt, daher muss das Zertifikat zu diesem Zeitpunkt bereits passen.
- Apache muss mit mod_ssl kompiliert/installiert sein. Dazu muss ausserdem OpenSSL vorhanden sein.
- Im folgenden wird davon ausgegangen, dass die Apache2-Konfiguration in /etc/apache2 vorliegt (und dort gesplittet in Unterdateien und -ordner). Falls dem nicht so ist muss man die entsprechenden Pfade einfach anpassen, bspw. /etc/httpd/httpd.conf
Erzeugen des Zertifikats
Zunächst müssen wir für den künftigen Host die benötigten Keys und Zertifikate erstellen. Dazu erstellt man ein leeres Verzeichnis und wechselt dorthin. Idealerweise sollte das Verzeichnis nicht von anderen Benutzern lesbar sein.
Exemplarisch könnte das als Root so gehen:
mkdir /root/cert cd /root/cert
Jetzt erstellen wir zunächste den privaten Server-Key, mit dem der Server die Request ver- und entschlüsseln kann.
Dazu dient das folgende Kommando:
openssl genrsa -des3 -rand: datei1:datei2 -out server.key 1024
Hinweise:
- Für die meisten Fälle sollte man das -des3 weglassen, da der Schlüssel sonst mit einer Passphrase verschlüsselt wird. Das ist zwar etwas unsicherer, doch ansonsten muss man bei jedem Apache-Start die Passphrase eingeben.
- Die Angabe von -rand datei1:…:dateiX ist optional und erzeugt “zufälligere” Schlüssel. Man sollte sie also nach Möglichkeit verwenden, bspw so:
-rand /var/log/messages:/var/log/apache2/access_log
Jetzt sollte man eine Datei namens server.key im Verzeichnis vorfinden. Damit bewaffnet erzeugt man nun einen sogenannten “Certificate Signing Request”.
Falls man ein unterschriebenes Zertifikat erwerben möchte muss man diese Datei anschließend an den Dienstleister versenden.
Der folgende Befehl erzeugt den Request:
openssl req -new -key server.key -out server.csr
ACHTUNG: Jetzt werden einem mehrere Fragen beantwortet, die man mehr oder weniger wahrheitsgetreu beantworten kann. Wichtig ist dabei nur die Frage nach dem Common Name (CN). Dieser spiegelt die Domain wieder, für die das Zertifikat gültig sein soll. Bei Falscheingaben wird man hinterher mit Fehlermeldungen seitens des Browser bestrafft.
Für die Adresse https://test.com/ gibt man hier bspw. test.com ein, falls der SSL-Host unter https://www.test.com/ lauschen soll nimmt man www.test.com.
Der nächste Schritt ist nur dann relevant, wenn man sich für ein selbstsigniertes Zertifikat entschieden hat.
Dann muss man sich mit folgenden Befehl ein selbstsigniertes Zertifikat erzeugen (welches dann im Browser zuerst einen Fehler anzeigt):
openssl x509 -req -in server.csr -signkey server.key -out server.crt -days X
Die Option -days X gibt dabei die Anzahl der Tage an, die das Zertifikat gültig ist. Mittels -days 365 erhält man bspw. ein Zertifikat, welches ein Jahr lang gültig ist.
Konfiguration von Apache
Die erzeugten Datei sollte man am besten nur für Root lesbar machen, insbes. dann wenn man den server.key nicht verschlüsselt hat.
chmod 400 server.*
Jetzt verschiebt man sie am besten in ein geeignetes Verzeichnis, unter SuSE bspw. so:
mv server.key /etc/apache2/ssl.key/ mv server.crt /etc/apache2/ssl.crt/ mv server.csr /etc/apache2/ssl.csr/
Auf anderen Systeme gibt es ähnliche Verzeichnisse.
Anschließend kann man sich um die Einrichtung des neues SSL-VHost kümmern. Wo diese Konfiguration stehen muss ist sehr unterschiedlich von der verwendeten Distribution, bei gesplitteten Konfigurationen könnten man bspw. eine eigene Datei in /etc/apache2/vhosts.d anlegen, alternativ kann man auch direkt in die httpd.conf schreiben.
Die folgende Konfiguration stellt ein Beispiel dar, welches man an geeigneter Stelle in die Konfiguration einbinden und an seine eigenen Gegebenheiten anpassen kann:
#Nur benutzen, falls SSL-Modul geladen ist
<IfModule mod_ssl.c>
#Ggf. noch folgenden 2 Zeilen einkommentieren, falls nicht bereits vorhanden
#Listen *:443
#NameVirtualHost *:443
<VirtualHost *:443>
#Einschalten von SSL
SSLEngine on
#Pfad zu Zertifikat und Key (anpassen!)
SSLCertificateFile /etc/apache2/ssl.crt/server.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/server.key
#IE-Problem mit SSL beheben (optional)
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
#Server-Basiskonfiguration (wie bei anderen VHosts auch)
ServerName test.com
DocumentRoot /srv/www/default
#Weitere Optionen für Directory etc. einfach hier einfügen
</VirtualHost>
</IfModule>
Anschließend kann man Apache neu starten und sollte nun auf der IP unter Port 443 (Standardport) einen SSL-Host laufen haben.
Falls das nicht der Fall ist sollte man als erstes die <IfModule>-Anweisung entfernen und es dann nochmal probieren. Auch sollte man sicherstellen, dass die Konfiguration auch eingebunden wird.
Schlusswort
Mit obiger Anleitung sollte es in kurzer Zeit möglich sein, einen SSL-VHost zu erstellen. Allerdings sind die Pfade und Konfigurationsdateien in alle Distributionen unterschiedlich, weswegen man ggf. viel anpassen muss.