Apache2 SSL Konfiguration mit letsencrypt.org unter Debian/Ubuntu

Aufrufe einer Webseite sollen verschlüsselt erfolgen. Denn nur so kann der Inhalt der übermittelten Daten zwischen Nutzer und Betreiber von Dritten auf dem Übertragungsweg nicht gelesen werden. Außerdem kann ein SSL Zertifikat die Echtheit eines Kommunikationspartners bestätigen.

Apache2 SSL Konfiguration mit letsencrypt.org unter Debian/Ubuntu
Aufrufe einer Webseite sollen verschlüsselt erfolgen. Denn nur so kann der Inhalt der übermittelten Daten zwischen Nutzer und Betreiber von Dritten auf dem Übertragungsweg nicht gelesen werden. Außerdem kann ein SSL Zertifikat die Echtheit eines Kommunikationspartners bestätigen.
SSL Labs Test Ergebnis

Auf dieser Seite wird ein kostenloses Zertifikat der letsencrypt.org CA der ISRG verwendet. Für die Ausstellung und Aktualisierung des Zertifikats wird das certbot Tool der EFF genutzt. Die Einrichtung ist dabei sehr einfach und gut organisiert. SSLlabs bietet einen Test für Webseitenbetreiber an, welcher die aktuelle SSL Konfiguration auf bekannte Schwachstellen überprüft und im Anschluss eine Schulnote (Ami System) auswirft.

Um bei diesem Test eine möglichst gute Note zu erreichen, solltet ihr die Vorgaben von bettercrypto.org umsetzen. Dieses Projekt stellt ein öffentlich zugängliches PDF Dokument zur Verfügung, welches Best Practices für die SSL Konfiguration diverser Dienste enthält.

Certbot Installation

Die Installation des Certbots ist auf dessen Seite für viele Linux Distributionen super und ausführlich beschrieben. Unter Ubuntu geht das zum Beispiel so:

sudo apt-get install certbot

Nachdem die Installation abgeschlossen ist, kann Certbot gestartet werden. Das folgende Kommando konfiguriert auch gleich den Apache mit:

sudo certbot --apache

Certbot führt euch jetzt dialogbasiert durch die Ausstellung des Zertifikats und konfiguriert die entsprechenden Vhosts des Apachen mit. Die so erstellten Zertifikate und Chain landen als symbolische Links in /etc/letsencrypt/live/(canonical-name), wobei  (canonical-name) mit dem abgesicherten Namen im Zertifikat übereinstimmt. Dieses Zertifikat kann natürlich jederzeit auch für andere Dienste (Mailserver o.ä.) auf dem gleichen System verwendet werden.

Wer die Vollautomatik nicht möchte, der kann die Ausstellung des Zertifikats auch manuell starten:

sudo certbot certonly --webroot --agree-tos -w /var/www/docroot/ \
--email user@domain.tld --expand \
-d www.domain.tld,subdomain.domain.tld,domain.tld

Wichtig ist dabei, dass die angegebenen Domainnamen im DNS auch wirklich auf den Server zeigen auf welchem der certbot ausgeführt wird. Der Certbot Client überprüft dann per http Challenge/Response (es wird eine Datei temporär in das Docroot gelegt) den Namen und stellt anschliessend das Zertifikat aus.

Der Speicherort ist dabei wieder /etc/letsencrypt/live/(canonical-name). Zertifikate von letsencrypt.org sind nur für 90 Tage gültig, diese Laufzeit ist recht kurz. Um keinen unnötigen administrativen Aufwand zu erzeugen, bietet certbot die Möglichkeit, bereits ausgestellte Zertifikate automatisch zu verlängern. Diesen Kommandoaufruf kann man mit Cron automatisieren, die Option --dry-run erlaubt einen Probelauf. Im eigentlichen Cronjob sollte man diesen Parameter dann natürlich unbedingt entfernen!

certbot renew --dry-run

Apache2 Konfiguration

Schauen wir uns mal an, was Certbot mit unserer Apache Konfiguration angestellt hat. Debian und Ubuntu Linux legen die Apache2 Konfiguration nach /etc/apache2 ab. Innerhalb dieses Verzeichnisses gibt es zwei relevante Unterverzeichnisse /etc/apache2/sites-available und /etc/apache2/sites-enabled. Die einzelnen Vhost Konfigurationen werden in sites-available angelegt und dann mit dem Kommando a2ensite (name) oder a2dissite (name) aktiviert bzw. deaktiviert.Nehmen wir diesen Server als Beispiel, hier liegt in /etc/apache2/sites-available folgendes:

-rw-r--r-- 1 root root 349 Mai 19 07:06 nerdathlete.de.conf
-rw-r--r-- 1 root root 801 Mai 21 06:09 nerdathlete.de-ssl.conf

Nach der einmaligen Aktivierung mit "a2ensite nerdathlete.de" und "a2ensite nerdathlete.de-ssl" werden die Konfigurationsdateien in /etc/apache2/sites-enabled verlinkt.

lrwxrwxrwx 1 root root 38 Mai 19 07:10 nerdathlete.de.conf -> ../sites-available/nerdathlete.de.conf
lrwxrwxrwx 1 root root 42 Mai 19 07:10 nerdathlete.de-ssl.conf -> ../sites-available/nerdathlete.de-ssl.conf

Ein Neustart des Apachen mit "systemctl restart apache2" setzt die Konfiguration dann letztendlich aktiv.

Was genau hat Certbot denn jetzt eigentlich getan?

Certbot hat bei der Einrichtung des SSL Zertifikats in der Konfigurationsdatei für den SSL VHost folgendes eingefügt:

SSLCertificateFile /etc/letsencrypt/live/nerdathlete.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nerdathlete.de/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Die ersten beiden Zeilen verweisen auf das SSL Zertifikat und dessen Keyfile. Die zweite Zeile inkludiert eine weitere Konfigurationsdatei, welche sich im /etc/letsencrypt Verzeichnis befindet. In dieser Datei werden SSL relevante Parameter gesetzt. Führt man mit dieser Konfiguration einen Test bei SSLLabs durch so erreicht man dort ungefähr eine Note "C". Um den Webserver etwas sicherer zu konfigurieren, nehmen wir das zuvor erwähnte PDF Dokument von bettercrypto.org zur Hilfe. Dort ist ab Seite 11 eine empfohlene Konfiguration für den Apache2 Webserver aufgeführt. Im Wesentlichen soll der Parameter SSLCipherSuite angepasst und ein HSTS Header gesetzt werden.

SSL Optimierung

Die SSLCipherSuite gibt dabei an, welche Verschlüsselungsverfahren für den Abruf gültig sind. Hier ist es sinnvoll, bereits als defekt oder unsicher geltende Verfahren auszuschließen. Leider geht das auf Kosten der Abwärtskompatibilität, d.h. ältere Browser und alte Betriebssysteme (Windows XP) können dann unter Umständen die Seite nicht mehr abrufen. Durch setzen des HSTS Headers erreichen wir, dass der Browser des Besuchers für den angegebenen Zeitraum bei erneuten Aufrufen unserer Seite ausschließlich https:// verwenden soll. Wer auf Nummer sicher gehen will, der kann zusätzlich noch HPKP konfigurieren - allerdings ist mir das bei einer Zertifikatsdauer von 90 Tagen zu viel Aufwand. Wir editieren also die Datei /etc/letsencrypt/options-ssl-apache.conf und ändern dort die Zeile für SSLCipherSuite wie folgt ab:

SSLCipherSuite 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA'

Um HSTS zu setzen, editieren wir die zutreffende VHost Konfigurationdatei (/etc/apache2/sites-available/mysite-ssl.conf) und fügen unter dem Include Statement folgende Zeile ein:

Header always set Strict-Transport-Security "max-age=15768000"

"max-age=15768000" gibt dabei den Zeitraum in Sekunden an, indem der Browser bei einer Wiederkehr auf unsere Seite zwingend https:// verwenden soll. Die Sekunden geben dabei einen Zeitraum von einem halben Jahr an. Es steht euch natürlich frei diesen Wert nach dem eigenen Geschmack anzupassen.

Viel Spass beim nachbauen!