Let’s Encrypt TLS-Zertifikat für Postfix

In 4 einfachen Schritten lässt sich der eigene Mailserver von einem Self-Signed Zertifikat auf ein offizielles TLS-Zertifikat von Let’s Encrypt umstellen.

Ausläöser für die Umstellung ist, das mein Self-Signed Zertifikat für meinen Mailserver ausgelaufen ist. Damit war eine Verbindung auf den Server zum Teil nicht mehr möglich. Da ich bereits  Let’s Encrypt für meine Webseiten einsetze, ist dies die Gelegenheit auch den Mailserver mit einem offiziellen Zertifikat abzusichern. Mit dem  Certbot ist das Zertifikat schnell beantragt und lässt sich im Betrieb leicht automatisiert erneuern.

Vorannahme:

ToDo’s

  1. Zertifikat für die Domain »mail.rheinmoselmedia.de« (ohne Webserver) beantragen
  2. Einbinden in Postfix und Dovecot
  3. Cronjob für die automatische Erneuerung
  4. Prüfen

TLS-Zertifikat beantragen

Sofern ihr einen Webserver auf dem gleichen System betreibt, müsst ihr diesen zunächst stoppen, damit der CertBot mit den Systemen von Let’s Encrypt reden kann.

certbot certonly --standalone -w /etc/postfix/ssl/ --rsa-key-size 2048 -d  mail.rheinmoselmedia.de
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mail.rheinmoselmedia.de
Cleaning up challenges
Problem binding to port 80: Could not bind to IPv4 or IPv6.

Nun also richtig und zunächst den Webserver stoppen.

systemctl stop httpd
certbot certonly --standalone --rsa-key-size 2048 -d  mail.rheinmoselmedia.de

Die Key Size ist im Beispiel mit 2048 noch recht klein die Empfehlung ist hier aktuell mit 4096 zu arbeiten. Nach dem ausführen der Befehle oben liegen die neu generierten Dateien (cert.pem, chain.pem, fullchain.pem, privkey.pem) auf meinem System unter

/etc/letsencrypt/live/mail.rheinmoselmedia.de/

Einbinden in Postfix und Dovecot

Um die neuen Zertifikate einzubinden müssen zwei Dateien angepasst werden:

  • /etc/postfix/main.cf
  • /etc/dovecot/dovecot.conf

main.cf
Hier werden die folgenden beiden Attribute neu gesetzt:

smtpd_tls_key_file = /etc/letsencrypt/live/mail.rheinmoselmedia.de/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.rheinmoselmedia.de/fullchain.pem

dovecot.conf
Analog in der Konfiguration vom Dovecot

ssl_cert = </etc/letsencrypt/live/mail.rheinmoselmedia.de/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.rheinmoselmedia.de/privkey.pem

Abschließend werden beide Jobs neu gestartet und geprüft, ob sie auch wieder im Status „active (running)“ sind

systemctl restart postfix
systemctl restart dovecot
systemctl status  postfix
systemctl status dovecot

Cronjob für die automatische Erneuerung

Wer noch keinen Cronjob für die automatische Erneuerung eingerichtet hat, sollte dies nun tun. Dazu die Datei

vi /etc/crontab

editieren und den folgenden Eintrag hinzufügen:

0 0,12 * * * root /usr/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/bin/certbot renew --post-hook "systemctl reload dovecot; systemctl reload postfix"

Eine Fehlerquelle wartet hier noch. Wer etwas im Netz stöbert, findet berichte, dass Zertifikate nicht erneuert werde, obwohl sie bald ablaufen. Hier kann die Option –force-renewal helfen. Da ich selbst solche Probleme noch nicht hatte, verzichte ich darauf.

Prüfen

openssl s_client -connect mail.rheinmoselmedia.de:25 -starttls smtp
openssl s_client -connect mail.rheinmoselmedia.de:993

Wenn beide Befehle ein Okay zurück geben, war der Wechsel der Zertifikate erfolgreich.
Fertig.

This article has 2 comments

  1. Florian Arndt Reply

    Ich war in der gleichen Situation und habe das gleiche Rezept erfolgreich angewendet. Lieben Dank für den kurzen und hilfreichen Artikel.

  2. Vivi G. Reply

    Dein Artikel hat mir sehr geholfen und vereinfach die Zertifikatswartung sehr 😀
    Nur beim cronjob musste ich ein kleine Anpassung machen, von „python“ auf „python3“ und schon lief es!
    Vielen Dank!

Leave a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert