Multi-Domain SSL mit Apache und openssl

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?

Zum nachlesen