Si j'ai le fichier réel et un shell Bash sous Mac ou Linux, comment puis-je interroger le fichier de certificat pour savoir quand il expirera? Pas un site Web, mais en fait le fichier de certificat lui-même, en supposant que je dispose des fichiers csr, key, pem et chain.
Avec openssl
:
openssl x509 -enddate -noout -in file.pem
La sortie est sur le formulaire:
notAfter=Nov 3 22:23:50 2014 GMT
Voir également réponse de MikeW pour savoir comment vérifier facilement si le certificat a expiré ou non, ou s'il le sera dans un certain délai, sans avoir à analyser la date ci-dessus.
Si vous voulez simplement savoir si le certificat a expiré (ou le fera dans les prochaines N secondes), l’option -checkend <seconds>
de openssl x509
vous indiquera:
if openssl x509 -checkend 86400 -noout -in file.pem
then
echo "Certificate is good for another day!"
else
echo "Certificate has expired or will do so within 24 hours!"
echo "(or is invalid/not found)"
fi
Cela vous évite de faire vous-même des comparaisons de date/heure.
openssl
retournera un code de sortie de 0
(zéro) si le certificat n'a pas expiré et ne le fera pas pendant les 86400 prochaines secondes, dans l'exemple ci-dessus. Si le certificat a expiré ou l'a déjà fait - ou une autre erreur telle qu'un fichier non valide/inexistant - le code de retour est 1
.
(Bien sûr, cela suppose que l’heure/la date est correctement réglée)
Voici ma ligne de commande bash pour répertorier plusieurs certificats dans l'ordre d'expiration, le plus récent expirant en premier.
for pem in /etc/ssl/certs/*.pem; do
printf '%s: %s\n' \
"$(date --date="$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" --iso-8601)" \
"$pem"
done | sort
Exemple de sortie:
2015-12-16: /etc/ssl/certs/Staat_der_Nederlanden_Root_CA.pem
2016-03-22: /etc/ssl/certs/CA_Disig.pem
2016-08-14: /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_S.pem
Voici une fonction bash qui vérifie tous vos serveurs, en supposant que vous utilisiez le round robin de DNS. Notez que cela nécessite GNU date et ne fonctionnera pas sous Mac OS
function check_certs () {
if [ -z "$1" ]
then
echo "domain name missing"
exit 1
fi
name="$1"
shift
now_Epoch=$( date +%s )
Dig +noall +answer $name | while read _ _ _ _ ip;
do
echo -n "$ip:"
expiry_date=$( echo | openssl s_client -showcerts -servername $name -connect $ip:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2 )
echo -n " $expiry_date";
expiry_Epoch=$( date -d "$expiry_date" +%s )
expiry_days="$(( ($expiry_Epoch - $now_Epoch) / (3600 * 24) ))"
echo " $expiry_days days"
done
}
Exemple de sortie:
$ check_certs stackoverflow.com
151.101.1.69: Aug 14 12:00:00 2019 GMT 603 days
151.101.65.69: Aug 14 12:00:00 2019 GMT 603 days
151.101.129.69: Aug 14 12:00:00 2019 GMT 603 days
151.101.193.69: Aug 14 12:00:00 2019 GMT 603 days
Pour MAC OSX (El Capitan) Cette modification de l'exemple de Nicholas a fonctionné pour moi.
for pem in /path/to/certs/*.pem; do
printf '%s: %s\n' \
"$(date -jf "%b %e %H:%M:%S %Y %Z" "$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" +"%Y-%m-%d")" \
"$pem";
done | sort
Exemple de sortie:
2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem
macOS n'a pas aimé les indicateurs --date=
ou --iso-8601
sur mon système.
Une ligne vérifiant la valeur true/false si le certificat a expiré plus tard (par exemple, 15 jours):
if openssl x509 -checkend $(( 24*3600*15 )) -noout -in <(openssl s_client -showcerts -connect may.domain.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM)
then
echo 'good'
else
echo 'bad'
fi
Si (pour une raison quelconque) vous souhaitez utiliser une application graphique sous Linux, utilisez gcr-viewer
(dans la plupart des distributions, il est installé par le paquet gcr
(sinon dans le paquet gcr-viewer
)).
gcr-viewer file.pem
# or
gcr-viewer file.crt