SSL/TLS mit Let's Encrypt
Bereits vergangene Woche berichtete ich von meinen Irrungen und Wirrungen des letzten Jahrzehnts mit SSL/TLS im Web. Erst Ende 2015 hatte ich mich aufgerafft, über StartCom für einige Domains Zertifikate erstellen zu lassen, und parallel die Berichterstattung über Let’s Encrypt verfolgt.
Der Workflow für die Erstellung und Pflege von HTTPS-Zertifikaten kann schnell komplex werden:
- Am Anfang steht die Erzeugung eines Schlüsselpaares, denn das spätere Zertifikat wird nur derjenige verwenden können, der auch den passenden privaten Schlüssel hat.
- Dann ist für jedes Zertifikat ein Certificate Signing Request (CSR) zu erstellen; das ist quasi die Roh-Form des späteren Zertifikats mit den notwendigen Informationen, die darin enthalten sein sollen.
- Dieser CSR muss dann von der Zertifierungsstelle (Certificate Authority, CA) digital signiert werden.
- Das so entstandene Zertifikat muss gespeichert und in die Webserver-Konfiguration eingebunden werden.
- Der ganze Ablauf ist nur zielführend, wenn die CA von den verbreiteten Browsern anerkannt ist, den von ihr signierten Zertifikaten also vertraut wird. Dafür wollen die meisten CAs Geld. Zudem müssen sie sich über einen mehr oder weniger aufwendigen Weg zumindest vergewissern, dass derjenige, der ein Zertifikat für einen bestimmten Hostnamen ausgestellt haben möchte, über diesen auch verfügen kann.
- Zertifikate werden in der Regel nur für einen begrenzten Zeitraum - meistens ein Jahr - ausgestellt. Danach müssen sie (rechtzeitig!) verlängert werden.
Let’s Encrypt ist angetreten, diese Abläufe weitestmöglich zu vereinfachen.
Let’s Encrypt - die Prinzipien
Let’s Encrypt arbeitet kostenlos und veröffentlicht die verwendeten Schnittstellen. Es stellt eine CA zur Verfügung, die automatisch Zertifikate ausstellt, nachdem sie überprüft hat, dass der Anfragende die administrative Kontrolle über den entsprechenden Hostnamen hat - beispielsweise, indem Let’s Encrypt verlangt, dass eine bestehende Datei auf dem Webserver unter diesem Hostnamen hinterlegt wird. Die erstellten Zertifikate werden öffentlich gemacht; es kann also jeder jederzeit nachvollziehen, wann Let’s Encrypt welche Zertifikate erstellt hat.
Mittlerweile ist das Zwischenzertifikat von Let’s Encrypt nicht nur durch Let’s Encrypt selbst, sondern auch durch eine andere CA (IdenTrust) signiert und wird daher regelmäßig von den Browsern als vertrauenswürdig anerkannt. Von Let’s Encrypt ausgestellte Zertifikate werden also akzeptiert und führen nicht zu irgendwelchen Warnmeldungen. Sie gelten allerdings nur rund 90 Tage und müssen dann erneut werden.
Let’s Encrypt stellt Client-Software zur Verfügung, die den gesamten, einleitend dargestellten Workflow automatisiert, ermöglicht es aber auch, die notwendigen Schritte in beliebigem Umfang manuell nachzuvollziehen oder auch eigene Lösungen zu programmieren. Im vollautomatischen Modus erstellt Let’s Encrypt das notwendige Schlüsselpaar und den CSR, überprüft, dass der Antragsteller den Hostnamen kontrolliert, stellt das Zertifikat aus und speichert es, passt die Webserver-Konfiguration an und bindet das Zertifikat ein und kann auf Wunsch rechtzeitig vor Ablauf ein neues Zertifikat erstellen.
Let’s Encrypt und der Apache-Webserver unter Debian Jessie
Im Anschluss möchte ich einen weitgehend, aber nicht völlig automatisierten Ablauf zum Erstellen von SSL-Zertifikaten und deren Einbindung in einen Apache unter Debian Jessie darstellen. Es ist durchaus möglich, weit weniger auf Automatismen zu setzen; dann muss der Client auch nicht zwingend mit Root-Rechten laufen. Matthias Gutjahr schildert in seinem Blog eine Möglichkeit dafür; Dirk Deimeke hat eine weitere Alternative dargestellt. Beide Beiträge sind am Ende dieses Blogbeitrags verlinkt.
Installation
Ab Jessie, der derzeit stabilen Debian-Version, steht letsencrypt
als Paket zur Verfügung, allerdings nur in den Backports. Wenn sich in der /etc/apt/sources.list
also die Zeile deb http://ftp.debian.org/debian jessie-backports main
findet, ist die Installation daher denkbar einfach:
apt-get -t jessie-backports install letsencrypt
Die umfangreichen Abhängigkeiten werden mitinstalliert.
Wer noch unter Wheezy arbeitet, benötigt etwas mehr Vertrauen in die Macher von Let’s Encrypt - und Platz für ein umfangreicheres Software-Paket (letsencrypt-auto
), das u.a. eine komplette virtuelle Python-Umgebung mit sich schleppt:
cd /usr/local
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help
letsencrypt-auto
akzeptiert dann denselben Input wie letsencrypt
.
Zertifikat erstellen lassen
letsencrypt
bietet eine ncurses
-Oberfläche, die es ermöglicht, auf einige Kommandozeilen-Parameter zu verzichten und ggf. notwendige Abfragen im Dialog zu beantworten. Dazu gehört beim ersten Start u.a. die Angabe einer E-Mail-Adresse für eine mögliche Kontaktaufnahme und die Bestätigung der AGB, die erforderlich ist. Danach erstellt letsencrypt
automatisch einen Account samt Schlüsselpaar, so dass weitere Aufrufe in der Regel ohne Interaktion ablaufen können.
Alle Daten werden standardmäßig unter /etc/letsencrypt/
abgelegt.
Der folgende Aufruf fordert ein Zertifikat für die Hostnamen domain.example
und www.domain.example
an, deren Dateien auf der Platte im Verzeichnis /var/www/domain.example
(Webroot) liegen:
letsencrypt certonly --webroot -w /var/www/domain.example/ -d domain.example -d www.domain.example
Falls notwendig, werden Mailadresse und Zustimmung zu den AGB (“Terms of Service”, “TOS”) abgefragt und ein privater Schlüssel (bzw. das Schlüsselpaar) erstellt. Dann wird der CSR an Let’s Encrypt geschickt, temporär eine unter http://domain.example/
abrufbare Datei im Webroot erstellt und so geprüft, dass man wirklich die Kontrolle über diesen Hostnamen hat, das Zertifikat erstellt, unter /etc/letsencrypt/archive/domain.example/
gespeichert und ein Symlink von /etc/letsencrypt/live/domain.example/
nach dort erstellt.
Soll das Zertifikat für weitere Hostnamen gelten, können beliebig viele Folgen von -w webroot -d hostname
angeschlossen werden. Es folgt jeweils auf das -w webroot
die Angabe der Hostnames, die zu diesem Webroot gehören.
Zertifikat beim Apache einbinden
Eine minimale Konfiguration für den virtual host könnte im Apache 2.4 (Debian Jessie) so aussehen:
<VirtualHost *:443>
ServerName domain.example
ServerAlias www.domain.example
DocumentRoot /var/www/domain.example
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/domain.example/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.example/privkey.pem
</VirtualHost>
Der Apache 2.2, der mit Debian Wheezy ausgeliefert wird, muss Zertifikat und Zwischenzertifikat der CA getrennt ausliefern:
<VirtualHost *:443>
[...]
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/domain.example/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/domain.example/chain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.example/privkey.pem
</VirtualHost>
Zertifikate erneuern
Folgender Cronjob prüft täglich um 4 Uhr morgens, ob ein Zertifikat erneuert werden muss, und nimmt diese Erneuerung automatisch vor, wenn sich der Ablaufzeitpunkt nähert:
00 4 * * * letsencrypt renew --keep-until-expiring
Weiterer Lesestoff
- Let’s Encrypt: Getting Started
- Wouter Verhelst im WEBlog — Wouter’s Eclectic Blog: Playing with Letsencrypt
- Matthias Gutjahr im Sperrobjekt Weblog: Let’s Encrypt-Zertifikate manuell erzeugen
- Dirk Deimeke in Dirks Logbuch: Let’s Encrypt …
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt