Réponses:
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 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 N secondes suivantes), l' -checkend <seconds>
option pour 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 d'avoir à faire vous-même des comparaisons date / heure.
openssl
renverra un code de sortie de 0
(zéro) si le certificat n'a pas expiré et ne le fera pas pendant les 86400 secondes suivantes, dans l'exemple ci-dessus. Si le certificat a expiré ou l'a déjà fait - ou une autre erreur comme un fichier invalide / inexistant - le code de retour est 1
.
(Bien sûr, cela suppose que l'heure / la date est réglée correctement)
-noout
option pour voir un message utile en utilisant une seule commande sans logique supplémentaire. Par exemple, openssl x509 -checkend 0 -in file.pem
donnera la sortie "Le certificat expirera" ou "Le certificat n'expirera pas" indiquant si le certificat expirera dans zéro seconde.
Voici ma ligne de commande bash pour répertorier plusieurs certificats par 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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
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 sur 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
expiry_date
valeur devra avoir le nom du fuseau horaire supprimé à la fin de celui-ci. Ajoutez un supplémentaire cut
à la fin du tuyau pour ce faire:| cut -d ' ' -f 1-4
Une ligne vérifiant vrai / faux si le certificat de domaine expirera dans un certain temps plus tard (ex. 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
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'aimait pas les indicateurs --date=
ou --iso-8601
sur mon système.
.cer
vous aviez simplement des certificats que vous venez de créer et de télécharger à partir du site Apple Dev?
Identique à la réponse acceptée, mais notez que cela fonctionne même avec un .crt
fichier et pas seulement avec un .pem
fichier, juste au cas où vous ne pourriez pas trouver l' .pem
emplacement du fichier.
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Résultat:
notAfter=Mar 29 06:15:00 2020 GMT
-startdate
et-enddate
intégrées à l'x509
utilitaire. Ils vous sauveront legrep
.