Lange schon wollte ich SSL bei mir laufen lassen, doch irgendwie habe ich es die letzten Male nicht geschafft, Apache richtig einzurichten. Aber eigentlich ist die Einrichtung trivial. Hier gibt es eine kurze Anleitung, wie man das macht.
Problemstellung
Will man für mehrere Domains unter einer IP-Adresse SSL anbieten, dann stand man früher vor einem Problem: Der Server weiß erst nach dem TLS-Handshake zur welchen Domain sich der Client verbinden will. Das liegt daran, dass alles bis auf die IP-Adresse verschlüsselt übertragen wird. Somit war es nicht möglich, für eine IP mehrere SSL-Zertifikate zu vergeben.
Seit einiger Zeit unterstützt aber Apache SNI (Server Name Indication) Dabei wird schon beim ersten Schritt des TLS-Handshakes die Virtuelle Domain übertragen und der Server weiß somit, welches Zertifikat er senden soll.
Das funktioniert überall prima, bis auf eine Ausnahme: Der Internet-Explorer <7 und alle IE’s unter Windows XP. Aber da dies unwichtige Randgruppen sind, ignorieren wir die am besten gleich mit 😉
SNI wird seit Apache 2.2.12 (bei Debian haben ist grad 2.2.16 aktuell) also sollte das kein Problem sein.
Konfiguration
Global
Damit SSL überhaupt funktioniert, musst du das Modul mod_ssl aktivieren:
a2enmod ssl
Die globale Konfigurationsdatei liegt bei mir in /etc/apache2/ports.conf. Dort solltest du, falls nicht vorhanden, folgende Zeilen hinzufügen:
NameVirtualHost *:443 Listen *:443 SSLStrictSNIVHostCheck off
Dies lässt Apache auf dem Standart-SSL Port horchen und richtet dafür Virtuelle Hosts ein. die Vorletzte Zeile sagt, dass Apache Browser, die SSL wollen, aber kein SNI beherrschen ignorieren soll. Wenn du einen default_ssl-Host hast, dann solltest du in der /etc/apache2/sites-available/default_ssl.conf folgendes stehen haben:
<VirtualHost *:443> …
Seiten-Konfiguration
Für jede Seite, die per SSL erreichbar sein soll, generierst du am besten ein eigenes Zertifikat. Ich lege die Zertifikatsdateien in /etc/apache2/ssl/ ab. Falls nicht vorhanden, erstelle dieses Verzeichnis.
Die nächsten Schritte solltest du für jede Domain durchführen.
Zertifikat erstellen
openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/domain.pem -keyout /etc/apache2/ssl/domain.pem
statt domain, setzt du am besten deinen Domain-Namen ein (Haha). Diesen Key, der im Klartext gespeichert wird, schützt du am besten vor neugierigen Augen:
chmod 400 /etc/apache2/ssl/domain.pem
Konfigurationsdatei bearbeiten
Diese sollten in dem Ordner /etc/apache2/sites-available/ liegen. Hier ein fertiges Beispiel:
<VirtualHost *:80> DocumentRoot "/home/example.com/htdocs" ServerName example.com <Directory "/home/example.com/htdocs"> allow from all Options -Indexes </Directory> </VirtualHost> <VirtualHost *:443> ServerName example.com DocumentRoot "/home/example.com/htdocs" SSLEngine On SSLCertificateFile /etc/apache2/ssl/example.pem <Directory "/home/example.com/htdocs"> allow from all Options -Indexes </Directory> </VirtualHost>
Die beiden VirtualHost-Statements unterscheiden sich nur durch den Port und durch die beiden SSL*-Zeilen. bei SSLCertificateFile trägst du einfach den Pfad zu deinem Zertifikat ein.
Fertig, das war doch nicht schwer oder?