Seit knapp einem Jahr maximal nutzte ich Cloudflare. Nicht unbedingt um den Webserver zu entlasten oder das Caching zu nutzen. Ich hatte Cloudflare eigendlich nur vor meinen Server gesetzt, um einfach, ohne viel installieren und konfigurieren, die Seite mit SSL zu verschlüsseln. Vor Cloudflare hatte ich mir Zertifikate bei StartSSL erstellt. Da das aber meine ersten Zertifikate waren, mit denen ich gearbeitet habe, ist das natürlich gründlich in die Hose gegangen, es hat nichts gepasst, da Private Key und Zertifikat vertaucht, gelöscht, weis ja auch nicht mehr. Widerrufen ging nicht. Ich war verzweifelt. Außerdem konnte nur eine bestimmte Anzahl an Zertifikaten ausgestellt werden, soweit ich mich entsinne. Es musste etwas einfaches her, das funktioniert.

Cloudflare ist einfach. Ich musste nur meine DNS-Einträge übernehmen, der Rest geht von alleine. Und es ist verschlüsselt. Zumindest sah es so aus. Aber Cloudflare ist mit den Antwortzeiten nicht all zu flott. Und Bandbreite spare ich auch nicht wirklich, da die SSL Verbindung nicht gecached wird. Das dann noch jemand zwischen mir und meiner Website steht, der mithören könnte, nur für SSL, …naja. Gut, es gibt hier nichts, was jemandem schaden würde, wenn es mitgelesen wird. Es geht hier jedoch ums Prinzip. Cloudflare sichert eben nur die Webseiten. Und ich habe immer noch kein Zertifikat.

Let’s Encrypt!

Zum 3.12.2015 ist Let’s Encrypt in die Public Beta gestartet. Darauf habe ich lange gewartet. Let’s Encrypt stellt kostenlose Zertifikate aus, die von Browsern akzeptiert werden. Erstellt und erneuert werden die Zertifikate vom eigenen Server mit deren Tool. Hat man einmal alle Domains konfiguriert, kann man sich einen cronjob anlegen, der die Zertifikate automatisch erneuert. Für mich eine sehr feine Sache, die sehr gut funktioniert.

Zum Setup

Cloudflare macht jetzt nur noch DNS. Da werde ich aber bei Cloudflare bleiben, denn die DNS Updates gehen dort sehr flott. Das ist für mein DynDNS  über deren API wichtig. Verschlüsslung also über die Let’s Encrypt Zertifikate.

Zum Erstellen der Zertifikate muss Let’s Encrypt feststellen, ob die Domain auch mir gehört. Die Domain zeigt auf meinen Server. Würde Sie nicht mir gehören, würde Sie woanders hin zeigen. Das Kommandozeilen-Tool fragt also nach, wo das Root-Verzeichnis der Domain auf dem Webserver liegt. In diesem Ordner legt es einen Verzeichnis „.well-known/acme-challenge/“ an. Und darüber verifiziert Let’s Encrypt dann das Zertifikat,indem das Tool dort z.B. eine Datei mit dem Namen zufälligen Namen „c1705ca5f38296a04e9e5f9e55533eae21609a8c“ ablegt und gleichzeitig an den Verifizierungsserver eine Anfrage sendet, ob unter der Domain diese Datei abgelegt ist. Kann der Server das bestätigen, gehört das Zertifikat dir. So mal im Groben. Da ich mehrere Root-Verzeichnisse zu mehreren Domains habe, hab ich mir die Mühe erspart, jede Domain zu ihrem Verzeichnis zu verlinken, sondern habe einen „.well-known/acme-challenge/“ Ordner erstellt und Apache gesagt, egal bei welcher Anfrage, egal welche Domain, ist das Verzeichnis, auf das zugegriffen werden soll „.well-known/acme-challenge/*“, nutze dieses Verzeichnis. In der apache2.conf sieht das dann wie folgt aus:

Alias /.well-known "/etc/letsencrypt/.well-known/"
RewriteEngine On

<IfModule mod_headers.c>
<LocationMatch "/.well-known/acme-challenge/*">
Header set Content-Type "application/jose+json"
RewriteEngine Off
</LocationMatch>
</IfModule>

Und der Befehl zum erstellen bzw. erneuern sieht dann wie folgt aus:

./letsencrypt-auto --renew-by-default --server https://acme-v01.api.letsencrypt.org/directory certonly --webroot -w /etc/letsencrypt -d meinedomain.de -d www.meinedomain.de -d meinezweitedomain.de

Jetzt müssen die VHosts noch mit den Zertifikaten konfiguriert werden. Let’s Encrypt erstellt beim erneuern immer ein neues Zertifikat unter neuem Namen, legt aber immer einen Link mit dem Namen der Domain (ohne Subdomains, da diese in dem Zertifikat mit drin sind) auf das neu erstellte Zertifikat. Wir müssen also nur einmal den Link in unseren VHosts anlegen.

<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/meinedomain.de/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/meinedomain.de/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/meinedomain.de/chain.pem
</IfModule> 

cert.pem, privkey.pem und chain.pem sind also jeweils nur Verlinkungen zu den Zertifikaten, die erstellt wurden.

Wichtig ist, dass man nach dem erneuern der Zertifikate den z.B. Webserver neu Startet, dass er das Zertifikat neu läd. Bei Apache genügt es auch, mod_ssl neu zu starten.