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:
- Certbot ist bereits installiert (Sonst siehe Certbot auf CentOS 7 installieren)
ToDo’s
- Zertifikat für die Domain »mail.rheinmoselmedia.de« (ohne Webserver) beantragen
- Einbinden in Postfix und Dovecot
- Cronjob für die automatische Erneuerung
- 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.
Ich war in der gleichen Situation und habe das gleiche Rezept erfolgreich angewendet. Lieben Dank für den kurzen und hilfreichen Artikel.
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!