web-dev-qa-db-fra.com

Comment déterminer la date d'expiration du certificat SSL à partir d'un certificat codé PEM?

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.

265
GL2014

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.

524
that other guy

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)

141
MikeW

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
17
Nicholas Sushkin

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

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.

2
Donald.M

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
1
Alexey

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
0
Attila123