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

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

10 Gedanken zu „Let’s-Encrypt-Zertifikate für Web und Mail unter Ubuntu 16.04“

  1. Sie haben recht, dieses Subkommando habe ich übersehen. Ich habe den Artikel entsprechend aktualisiert.

  2. In der Tat. Ich habe den Code für /etc/cron.weekly/letsencrypt im Blog-Beitrag aktualisiert. Vielen Dank für den Hinweis!

  3. Hilfreiche Anleitung – Danke hierfür.
    Ich habe in meinem vSphere Homelab (DSL mit fester IP) zwei ubuntu-Server 16.04 aufgesetzt:
    Einer macht nextcloud und konnte erfolgreich mit Lets Encrypt konfiguriert werden.
    Der zweite dient als Mailserver. Um für diesen ein Zertifikat zu erhalten, musste ich temporär am Router die Weiterleitung des Ports 443 vom nextcloud-Server auf den Mailserver umlenken.
    Das ist natürlich keine dauerhafte Lösung.
    Wie erreicht man es, dass beide Server ihre Zertifikate automatisiert erneuern?

  4. Hallo Herr Kofler. Danke für diese wertvolle Anleitung. Könnten Sie vielleicht noch ergänzen, welche iptable Befehle man absetzen würde, damit Verbindungsanfragen von außen möglich sind?
    Gruß aus Hamburg

    1. Der letsencrypt-Client verwendet meines Wissens nur die Ports 80 und 443. Wenn auf dem Rechner also ein Web-Server läuft, dann sollten diese Ports auf jeden Fall offen sein.

  5. Tip: Mit -noout spuckt openssl x509 nicht zusätzlich noch das ganze base64enkodierte Zertifikat mit aus:

    openssl x509 -noout -text -in $CERT

  6. Die mit Let’s-Encrypt-Zertifikaten eingerichtete Seite ist:

    https://ubuntu-buch.info

    kofler.info habe ich schon früher auf https umgestellt, da gab’s noch kein Let’s Encrypt. Aber sobald das Thawte-Zertifikat ausläuft …

  7. Hallo Herr Kofler,

    danke für die Anleitung. Ich habe LetsEncrypt aktuell bei mir auf dem VServer am Laufen. Als Verwaltungsoberfläche nutze ich ISPConfig und für die dadurch generierten Domains werden dann auch die LE-Zertifikate erstellt. Das klappt soweit auch wunderbar.
    Die von Ihnen beschriebene Lösung zur Verwendung der LE-Zertifikate in Postfix und Dovecot finde ich interessant. Wenn ich es aber richtig verstehe, funktioniert die Lösung nur für einen einzelnen Server-Namen, bspw. smtp.hostingserver.com.
    Wenn ich jetzt aber verschiedene Webseiten auf dem Server laufen habe, und für jede Domain eigene Email-Adressen existieren, dann wäre es schön, wenn ich das Domain-LE-Zertifikat des Kunden auch verwenden könnte für smtp.kundendomain.de

    Das wird aber nicht funktionieren, oder? Und wenn ja, wie?!

    Die nächste Sache wäre, wie ich das Webmailer verschlüsseln kann. Aktuell ist der Webmailer (Roundcube) für alle Domains unter mail.AlleKundendomains.de erreichbar. Wenn ich jetzt nach Ihrer Beschreibung aber für den Server selbst ein LE-Zertifikat verwende, müsste ich den Webmailer auch nur direkt mit dem Servernamen ansprechen. Oder kann ich hier auch die LE-Kundendomain-Zertifikate verwenden?

    Wäre schön, wenn Sie die Anleitung dahingehend noch erweitern könnten.
    H.
    Was ich bislang nicht hinbekommen habe ist

    1. Mit Multi-Domain-Mail-Servern habe ich leider zu wenig Erfahrung als dass ich hier mit Anleitungen dienen kann.

Kommentare sind geschlossen.