Comment déterminer la date d’expiration du certificate SSL à partir d’un certificate codé PEM?

Si j’ai le fichier réel et un shell Bash sous Mac ou Linux, comment puis-je interroger le fichier cert pour savoir quand il expirera? Pas un site Web, mais en fait le fichier de certificate lui-même, en supposant que je possède les 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 la réponse de MikeW pour savoir comment vérifier facilement si le certificate a expiré ou non, ou s’il le sera dans un certain délai, sans avoir à parsingr la date ci-dessus.

Si vous voulez simplement savoir si le certificate a expiré (ou le fera dans les prochaines N secondes), l’ -checkend à 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 évite d’avoir à faire des comparaisons de date / heure.

openssl retournera un code de sortie de 0 (zéro) si le certificate n’a pas expiré et ne le fera pas pendant les 86400 secondes suivantes. Si le certificate a expiré ou l’a déjà fait – ou une autre erreur telle qu’un fichier invalide / inexistant – le code de retour est 1 .

(Bien sûr, cela suppose que l’heure / la date est correctement définie)

Voici ma ligne de commande bash pour répertorier plusieurs certificates dans leur ordre d’expiration, le plus récemment 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 

Sortie de l’échantillon:

 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 utilisez DNS Round-Robin. Notez que cela nécessite une date GNU 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 Nicolas 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 

Échantillon sortie:

 2014-12-19: /path/to/certs/MDM_Certificate.pem 2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem 

macOS n’aimait pas les --date= ou --iso-8601 sur mon système.

Si (pour une raison quelconque) vous souhaitez utiliser une application graphique sous Linux, utilisez gcr-viewer (dans la plupart des dissortingbutions, il est installé par le paquet gcr (sinon dans le paquet gcr-viewer ))

 gcr-viewer file.pem # or gcr-viewer file.crt