Abgelaufene SSL Zertifikate

Es ist mir leider mehr als nur ein mal passiert, dass der Mailserver mit abgelaufenen SSL-Zertifikaten lief. Bei Let’s Encrypt laufen diese Zertifikate ja relativ schnell (3 Monate) ab. Daher brauche ich eine Warnung, falls das passiert und der automatische Restart nicht geklappt hat.

Man kann natürlich die Cert Dateien im Filesystem prüfen, aber viel besser ist doch den Dienst direkt zu fragen. Und das geht so (und das kann auch remote laufen):

#!/bin/bash

# SMTPS Host to check
HOST=my.mailserver.tld
# Days before end of cert to warn/take action
WARNDAYS=14
# admin email
CONTACT="adminofmymailserver@gmail.com"

ENDDATE=$(echo QUIT | openssl s_client -connect $HOST:465 -verify_return_error 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'| openssl x509 -noout -dates  | fgrep notAfter | sed 's/notAfter=//g')
# echo $ENDDATE cert expires
EPOCHENDDATE=$(date --date="$ENDDATE" +"%s")
# echo epoch is $EPOCHENDDATE
EPOCHTODAY=$(date +"%s")
let TIMELEFT=$EPOCHENDDATE-$EPOCHTODAY
DAYSLEFT=$(echo "$TIMELEFT/86400" | bc)
# echo time left $DAYSLEFT days
if [ $DAYSLEFT -le $WARNDAYS ]; then
  echo "WARNING: Cert for $HOST expires in $DAYSLEFT days!" | mail -s "WARNING: Cert for $HOST expires in $DAYSLEFT days!" $CONTACT
  # /etc/init.d/exim4 restart
fi

Die Herausforderung ist, das Ablaufdatum im Zertifikat in Tage gerechnet von Heute umzuwandeln. Das geht mit dem Befehl „date“, der in epoch umwandelt und einer einfachen Division ohne Rest durch 86400 (Sekunden pro Tag) der Differenz mit „bc“.

Abgelaufene SSL Zertifikate

„Let’s Encrypt“ mit vsftpd und anderen

Ich habe einen vsftpd laufen und der sollte auch ein Let’s Encrypt Zertifikat für sicheres FTP bekommen.

Ich habe einen vhost im Apache für die Domain angelegt, unter der ich den vsftpd erreichbar mache und dann über den certbot das Zertifikat erstellen lassen. Das klappt auch alles gut, aber der Cronjob für das Renewal der Certifikate startet bei einer Aktualisierung nur den Apache neu und nicht den vsftpd. Und jedes Mal den vsftpd mitneustarten ist ja auch unschön. Daher habe ich einen eigenen Cronjob dafür gebaut.

Aber erst mal die vsftpd config:

rsa_cert_file=/etc/letsencrypt/live/[MYDOMAIN]/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/[MYDOMAIN]/privkey.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

Diese Zeilen einfach am Ende hinzufügen und den vsftpd neu starten.

Und das ist der dazugehörige Cronjob.

1 6,18 * * * /usr/local/sbin/certbot-auto certonly --webroot -n -d [MYDOMAIN] --post-hook "/etc/init.d/vsftpd restart" >/dev/null 2>/dev/null

Ich habe dafür gesorgt, dass er 5 Minuten vor dem regulären Cronjob läuft, damit dieses Zertifikat für [MYDOMAIN] auch tatsächlich von diesem Cron erneuert wird. Die Option -d kann auch mehrfach angegeben werden, falls das Zertifikat auf mehrere Domains lauten soll.
Das Plugin --webroot ist in meinem Fall ausreichend. Wenn man aber keinen eigenen Webserver betreibt, kann man auch mit --standalone einen temporären starten, der dann die Authentifizierungen gegenüber Let’s Encrypt übernimmt.

Ähnlich kann man das natürlich auch mit Zertifikaten für Mailserver und andere machen.

„Let’s Encrypt“ mit vsftpd und anderen

Let’s encrypt!

Ich habe meine Seiten auf meinem Debian/Apache Webserver mit SSL verschlüsselt und dabei auf die kostenlose CA Let’s Encrypt! zurückgegriffen.

Es gibt viele Wege, wie man diese CA benutzen kann, aber der certbot ist echt der Hammer. So einfach geht es:

cd /usr/local/sbin
wget https://dl.eff.org/certbot-auto
chmod 750 certbot-auto
certbot-auto --apache

Danach wird man durch alle Schritte geführt und kann inerhalb kürzester Zeit funktionierende SSL Zertifikate nutzen, die sich vollautomatisch installieren.

Die Zertifikate sind zwar nur drei Monate gültig, aber mit certbot installierte Zertifikate lassen sich über diesen automatisch aktualisieren, so dass man sich nie wieder drum kümmern muss. Ein Eintrag wie dieser im Crontab von root reicht:

1 6,18 * * * /usr/local/sbin/certbot-auto renew --post-hook "apache2ctl restart" &>/dev/null

Lasst uns gemeinsam das Internet sicherer machen und „Let’s encrypt!

letsencrypt
https://eliyah.co.il/ ist SSL gesichert!

Let’s encrypt!

SSL-Zertifikate holen und prüfen

Wenn man das Zertifikat für eine Webseite prüfen will, geht das komfortabel über die entsprechende Funktion im Browser. Aber was ist mit anderen Protokollen? Etwa imaps? Mit diesem Befehlt holt man sich das Zertifikat und noch einiges mehr:

openssl s_client -connect {HOST}:{PORT}

Wenn man aber prüfen will, ob das Zertifikat gültig ist, dann geht das unter OS X mit folgendem Befehl:

security verify-cert -p ssl -s {HOST}  -c {HOST}.crt

Alles zusammen in einem Befehl:

HOST={HOST} ;  PORT={PORT} ; echo "" | openssl s_client -host $HOST -port $PORT 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$HOST.crt ; security verify-cert -p ssl -s $HOST -c /tmp/$HOST.crt ; rm /tmp/$HOST.crt

Um ein PEM Zertifikat menschenlesbar zu machen, hilft dieser Befehl:

openssl x509 -noout -text -in [zertifikat.pem]
SSL-Zertifikate holen und prüfen