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.
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.