Let’s-Encrypt-Zertifikate für Web und Mail unter Ubuntu 16.04 einrichten

Das Projekt Let’s Encrypt bietet kostenlose Zertifikate an, die von den meisten gängigen Webbrowsern akzeptiert werden. Wie Sie diese Zertifikate unter Ubuntu 16.04 für Apache, Postfix und Dovecot einrichten, ist Thema dieses Beitrags. Dabei setze ich ein grundsätzliches Vorwissen zur HTTPS-Konfiguration von Apache sowie zur Konfiguration von Postfix und Dovecot voraus. Hier geht es nur um das Einrichten der Zertifikate. Die Konfiguration wurde für die Webseite https://ubuntu-buch.info getestet. Diese Webseite läuft unter Ubuntu 16.04 und verwendet Let’s-Encrypt-Zertifikate.

Update 20.3.2016: letsencrypt renew anstelle von le-renew

Update 5.6.2016: Begründung für ServerAlias

Update 13.7.2016: nach Zertitifikatserneuerung Apache/Postfix/Dovecot neustarten

Update 19.4.2017: Umstellung vom Kommando letsencrypt auf das neue Kommando certbot (siehe https://certbot.eff.org/). Mittlerweile verwendet auch meine Hauptseite https://kofler.info Let’s-Encrypt-Zertifikate.


Für das Let’s-Encrypt-Projekt gelten drei Grundannahmen, die sich von den etablierten Zertifizierungsstellen wie Thawte oder Verisign unterscheiden:

  • Überprüft wird nur die Domain, nicht aber, wer Sie sind bzw. ob es Ihre Firma gibt. Die Zertifikate haben damit die gleiche Qualität wie die jeweils kostengünstigsten Zertifikate kommerzieller Anbieter. Für private/kleine Webauftritte ist das absolut ausreichend. Let’s Encrypt richtet sich aber nicht an Online-Shops, große Firmen, Banken etc., bei deren Zertifikaten (gegen gutes Geld) auch der Inhaber der Domain überprüft wird.

  • Die Installation der Zertifikate erfolgt weitgehend automatisiert durch das Kommando certbot. Damit entfällt das umständliche Handling mit Schlüsseln und Zertifikatsdateien, die per E-Mail versendet bzw. manuell heruntergeladen werden müssen. In diesem Punkt bietet Let’s Encrypt mehr Komfort als kommerzielle Anbieter.

  • Die Zertifikate sind generell nur 90 Tage gültig. Das ist nicht weiter schlimm — ich werde Ihnen gleich zeigen, wie Sie den Zertifikatserneuerungsprozess automatisieren können.

Hinweis: Um Missbrauch zu vermeiden, gibt es strikte Limits, wie viele Zertifikate für eine Domain in einer bestimmten Zeit erzeugt werden dürfen:

https://letsencrypt.org/docs/rate-limits

Um zu vermeiden, dass Sie diese Limits überschreiten, sollten Sie das Kommando certbot für erste Tests die Option --staging (ehemals --test-cert) verwenden. Damit erhalten Sie vorerst Zertifikate von einem Test-System. Erst wenn Sie sicher sind, dass alles funktioniert, erstellen Sie die richtigen Zertifikate, indem Sie certbot nochmals ohne diese Option ausführen.

Das Kommando certbot installieren

Let’s Encrypt stellt lediglich die Zertifikats-Infrastruktur zur Verfügung. Um die Entwicklung des offiziellen Let’s-Encrypt-Client kümmert sich die Electronic Frontier Foundation (EFF) um die Entwicklung und Wartung der Software. Der offizielle Let’s-Encrypt-Client hat seither den Namen certbot. Installationsanleitungen für diverse Distributionen finden Sie auf der Seite https://certbot.eff.org. Unter Ubuntu 16.04 führen Sie die folgenden Kommandos aus:

add-apt-repository ppa:certbot/certbot
apt update
apt install python-certbot-apache

Let’s-Encrypt-Zertifikate für Apache installieren

Um Let’s-Encrypt-Zertifikate anzufordern und für den Webserver Apache zu installieren, führen Sie das folgende Kommando aus. Dabei ersetzen Sie meine-domain.de durch Ihren Domainnamen. Die Zertifikate für smtp.* und imap.* sollen später zur sicheren Konfiguration des Mail-Servers verwendet werden. Wenn Sie nicht vor haben, einen Mail-Server einzurichten, lassen Sie diese beiden Hostnamen weg. Nicht verzichten sollten Sie hingegen auf die www-Variante, selbst wenn Sie http://domainname gegenüber http://www.domainname vorziehen. Das www-Subdomain-Zertifikat ist erforderlich, damit HTTPS-Rewrite-Regeln von www.domainname auf domainname funktionieren.

Erst wenn Sie sicher sind, dass alles klappt, entfernen Sie zuletzt die Option --staging und wiederholen das Kommando nochmals zur Installation der endgültigen Zertifikate.

certbot --apache --staging -d www.meine-domain.de \
  -d meine-domain.de -d imap.meine-domain.de \
  -d smtp.meine-domain.de

Das Kommando certbot fordert Sie auf, einen E-Mail-Namen anzugeben. Über diese E-Mail werden Sie verständigt, wenn Ihre Zertifikate ablaufen. Wenn certbot in der Apache-Konfiguration keine Datei mit ServerName-Einstellungen findet, die mit den von Ihnen angegebenen Hostnamen übereinstimmen, müssen Sie in einem weiteren Dialog auswählen, in welche Apache-Konfigurationsdatei die SSL-Konfiguration eingetragen wird. Außerdem können Sie entscheiden, ob Ihre Webseite auch via HTTP zugänglich sein soll, oder ob HTTPS das einzig erlaubte Protokoll ist. certbot fügt dann auch entsprechende Umleitungsanweisungen in Ihre Apache-Konfiguration ein.

certbot fordert nun beim Let’s-Encrypt-Projekt die für Sie generierten Zertifikate an, lädt diese herunter, installiert alle erforderlichen Dateien in das Verzeichnis /etc/letsencrypt, verändert die Apache-Konfiguration und startet Apache schließlich neu.

Das folgenden Zeilen zeigen beispielhaft zwei geänderte Apache-Konfigurationsdateien. Aus Platzgründen wurden einige Einstellungen über zwei Zeilen verteilt.

# z. B. in der Datei /etc/apache2/sites-available/default-ssl.conf
...
SSLCertificateFile    
  /etc/letsencrypt/live/www.meine-domain.de/fullchain.pem
SSLCertificateKeyFile 
  /etc/letsencrypt/live/www.meine-domain.de/privkey.pem
ServerName    meine-domain.de
# die ServerAlias-Zeilen sind notwendig, damit die 
# automatische Zertifikat-Erneuerung auch für
# die Mail-Zertifikate gelingt
ServerAlias   imap.meine-domain.de
ServerAlias   smtp.meine-domain.de
# Datei /etc/apache2/sites-available/000-default-le-ssl.conf
...
SSLCertificateFile    
  /etc/letsencrypt/live/www.meine-domain.de/fullchain.pem
SSLCertificateKeyFile 
  /etc/letsencrypt/live/www.meine-domain.de/privkey.pem
Include               
  /etc/letsencrypt/options-ssl-apache.conf
ServerName www.meine-domain.de

Die ServerAlias-Zeilen sind für den Web-Server-Betrieb überflüssig, stören aber nicht. Sie müssen in der Konfigurationsdatei bleiben, damit die automatische Zertifikatserneuerung funktioniert.

Nach einem ersten Test, ob https://www.meine-domain.de und https://meine-domain.de in einem Webbrowser angezeigt werden können, sollten Sie Ihre HTTPS-Konfiguration noch über die Seite https://www.ssllabs.com kontrollieren. Diese Seite führt umfassende Tests durch, ob Apache nach allen Regeln der Kunst sicher konfiguriert ist.

https://www.ssllabs.com/ssltest/analyze.html?d=www.meine-domain.de

SSL Labs ist mit der HTTPS-Konfiguration zufrieden
SSL Labs ist mit der HTTPS-Konfiguration zufrieden

Automatische Erneuerung der Let’s-Encrypt-Zertifikate

Mit dem openssl-Kommando können Sie ein Blick in Ihr Zertifikat werfen:

openssl x509 -text -in \
  /etc/letsencrypt/live/www.meine-domain.de/cert.pem

  ...
  Certificate:
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X1
        Validity
            Not Before: Mar 17 12:27:00 2016 GMT
            Not After : Jun 15 12:27:00 2016 GMT
    Subject: CN=www.meine-domain.de
    X509v3 Subject Alternative Name: 
             DNS:imap.meine-domain.de, 
             DNS:smtp.meine-domain.de, 
             DNS:meine-domain.de, 
             DNS:www.meine-domain.de

Aus den Daten geht hervor, dass das Zertifikat nur 90 Tage gültig ist. Das erscheint auf den ersten Blick wie eine große Einschränkung zu sein. Tatsächlich ist Let’s Encrypt aber dahingehend konzipiert, dass es recht einfach ist, die Zertifikate regelmäßig automatisiert zu erneuern. Das Kommando

certbot renew

kontrolliert alle Let’s-Encrypt-Zertifikate Ihres Rechners und erneuert alle, die in den nächsten 30 Tagen auslaufen. Es geht also nur noch darum, den Aufruf von certbot renew automatisch einmal pro Woche durchzuführen. Dazu erstellen Sie mit einem Editor die Datei /etc/cron.weekly/letsencrypt mit dem folgenden Inhalt:

#!/bin/sh
# Datei /etc/cron.weekly/letsencrypt
certbot renew

Jetzt machen Sie die Datei noch ausführbar:

chmod a+x /etc/cron.weekly/letsencrypt

Um den Neustart von Apache kümmert sich certbot selbst. Dabei laufen vorhandene Prozesse weiter, sodass es zu keinen Verbindungsabbruch oder Session-Verlust kommt, neue Prozesse verwenden dann die neue Konfiguration (Quelle).

Falls Sie wie im folgenden Abschnitt beschrieben auch Zertifikate für Postfix und Dovecot einrichten, müssen sie diese Programmen explizit neu starten. Ein geeignetes Script für Cron kann wie folgt aussehen:

#!/bin/sh
# Datei /etc/cron.weekly/letsencrypt
certbot renew
result=$(find /etc/letsencrypt/live/ -type l -mtime -1 )
if [ -n "$result" ]; then
  systemctl restart postfix
  systemctl restart dovecot
fi

Let’s Encrypt für Postfix und Dovecot

Die Let’s-Encrypt-Zertifikate sind grundsätzlich universell verwendbar. Da es aber üblich ist, den SMTP-Server über den Hostnamen smtp.meine-domain.de und den IMAP-Server über imap.meine-domain.de anzusprechen, müssen Sie auch für diese beiden Hostnamen Zertifikate anfordern.

Vielleicht wird es in Zukunft certbot-Plugins geben, die sich auch um die Konfiguration der Zertifikate kümmern. Momentan ist dazu ein wenig Handarbeit erforderlich. Damit Postfix und Dovecot die Zertifikate nutzen, müssen Sie die folgenden Änderungen in den Konfigurationsdateien durchführen:

# Datei /etc/postfix/main.cf
...
smtpd_tls_cert_file=
  /etc/letsencrypt/live/www.meine-domain.de/fullchain.pem
smtpd_tls_key_file=
  /etc/letsencrypt/live/www.meine-domain.de/privkey.pem
# Datei /etc/dovecot/conf.d/10-ssl.conf
...
ssl = yes
ssl_cert = </etc/letsencrypt/live/www.meine-domain.de/fullchain.pem
ssl_key  = </etc/letsencrypt/live/www.meine-domain.de/privkey.pem

Damit die Änderungen wirksam werden, starten Sie Postfix und Dovecot neu:

service postfix restart
service dovecot restart

PS: Ich gehe hier davon aus, dass Sie Postfix und Dovecot so konfiguriert haben, dass Dovecot die SMTP-Authentifizierung für Postfix übernimmt. Eine Anleitung finden Sie z.B. hier.

Quellen