Wer jede Menge TLS-verschlüsselte Dienste (früher sagte man mal SSL, wer aber noch SSL verwendet, braucht eigentlich gar keine Verschlüsselung mehr) betreibt, der will vielleicht automatisiert prüfen, wie lange die verwendeten Zertifikate noch gültig sind.

Das kann besonders sinnvoll sein, wenn man zB bei letsencrypt.org automatisiert Zertifikate signieren lässt und regelmässig prüfen lassen will, ob die aktualisierten Zertifikate auch zum Einsatz kommen.

Ich habe mal schnell folgendes zusammengestoppelt:

#!/bin/bash
NOW=`date +%s`
for A in HTTPS:anselm.hoffmeister.be SMTPS:mail.hoffmeisterdv.de IMAPS:mail.hoffmeisterdv.de ; do
    MODUS=${A:0:5}
    HOST=${A:6}
    echo -n "Checking $MODUS on $HOST..."
    case "${MODUS}" in
      HTTPS)
        PAR=""
        PORT=443
        ECHO=""
      ;;
      SMTPS)
        PAR="-starttls smtp"
        PORT=25
        ECHO="QUIT"
      ;;
      IMAPS)
        PAR=""
        PORT=993
        ECHO="QUIT LOGOUT"
      ;;
    esac
    EXPIRE=$((sleep .25 ; echo -e "${ECHO}") | openssl s_client -connect "${HOST}:${PORT}" -servername "${HOST}" ${PAR} 2>/dev/null | sed -e '1h;2,$H;$!d;g' -n -re 's/.*[^-]([-]*BEGIN CERT.*END CERTIFICATE[-]*)[^-].*/\1/p' | openssl x509 -noout -dates 2>/dev/null | sed -nr "s/^notAfter.(.*) GMT.*/\\1/p")
    if [ -z "${EXPIRE}" ] ; then
        echo "FAIL TO READ CERTIFICATE"
        continue
    fi
    FINISH=`date --date="${EXPIRE}" +%s`
    RESTSECONDS=$((${FINISH}-${NOW}))
    RESTDAYS=$((${RESTSECONDS}/86400))
    COLOR=31
    if [ "${RESTDAYS}" -gt 25 ] ; then COLOR=33 ; fi
    if [ "${RESTDAYS}" -gt 55 ] ; then COLOR=32 ; fi
    echo -e "\e[${COLOR}m${RESTDAYS} days remaining\e[0m."
done

Das zeigt für die oben gelisteten Dienst an, ob das Zertifikat noch eine Weile hält, und funktioniert auch für HTTPS mit SNI (Server Name Indication) sowie SMTPS mit STARTTLS.