Monitorer des certificats avec Bash

Origine

Après avoir lu un article sur comment monitorer des certificats avec Perl, je n’ai pas pu m’empêcher de penser: «mais perl n’est pas nécessaire!». En effet, openssl est un véritable couteau suisse pour manipuler les certificats.

Voici donc un petit script, qui prend en argument une liste de domaines et de ports, et qui retourne le nombre de jours avant leurs expirations.

Ligne de commande

Le script

#!/bin/bash

get_date () {
    local host=$1
    local port=$2
    text_date=$(echo - | openssl s_client -ign_eof -showcerts -servername $host -connect $host:$port 2>/dev/null | openssl x509 -inform pem -noout --enddate|cut -f 2 -d =)
    echo $text_date
}

get_nb_days () {
    local date=$1
    now=$(date +"%s")
    expire=$(date --date="${date}" --utc +"%s")
    seconds_expire=$(($expire-$now))
    days_expire=$((${seconds_expire}/$((60*60*24))))
    echo $days_expire
}

main () {
    for var in "$@"
    do
        text_date=$(get_date ${var/:/ })
        nb_days=$(get_nb_days "$text_date")
        echo $var $nb_days
    done
}

main "$@"

Explications et limites

Ce script utilise essentiellement:

  • la commande s_client d’OpenSSL;
  • la commande date, version GNU (j’ai lu quelque part que l’argument +"%s" ne marchait pas avec la version fournie par MacOS)

Le programme boucle sur les arguments passés, qui doivent être de la forme: host:port. En sortie il affiche chaque host:port suivi du nombre de jours avant l’expiration du certificat.

Les deux fonctions get_date et get_nb_days peuvent être re-utilisées pour d’autres scripts, par exemple pour n’afficher que les certificats qui expirent dans 15 jours ou dans 7 jours.