bash let's - Come determinare la data di scadenza cert SSL da un certificato codificato PEM?




encrypt version (6)

Se ho il file attuale e una shell Bash in Mac o Linux, come posso interrogare il file cert per quando scadrà? Non un sito Web, ma in realtà il file del certificato stesso, supponendo che disponga dei file csr, key, pem e chain.


Answers

Con openssl :

openssl x509 -enddate -noout -in file.pem

L'output è nella forma:

notAfter=Nov  3 22:23:50 2014 GMT

Vedi anche la risposta di MikeW su come verificare facilmente se il certificato è scaduto o meno, o se sarà entro un certo periodo di tempo, senza dover analizzare la data di cui sopra.


Per MAC OSX (El Capitan) Questa modifica dell'esempio di Nicholas ha funzionato per me.

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

Uscita di esempio:

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

macOS non ha gradito i --date= o --iso-8601 sul mio sistema.


Ecco la mia riga di comando di bash per elencare più certificati in ordine di scadenza, il più recente in scadenza prima.

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

Uscita di esempio:

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

Ecco una funzione di bash che controlla tutti i tuoi server, supponendo che tu stia usando DNS round-robin. Nota che questo richiede la data di GNU e non funzionerà su 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
}

Esempio di uscita:

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

Se vuoi solo sapere se il certificato è scaduto (o lo farà entro i successivi N secondi), l' -checkend <seconds> per openssl x509 ti dirà:

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

Questo evita di dover fare confronti di data / ora.

openssl restituirà un codice di uscita di 0 (zero) se il certificato non è scaduto e non lo farà per i successivi 86400 secondi. Se il certificato è scaduto o lo ha già fatto - o qualche altro errore come un file non valido / inesistente - il codice di ritorno è 1 .

(Naturalmente, si presuppone che l'ora e la data siano impostate correttamente)


# This script fragment emits Cygwin rulez under bash/cygwin
if [ "$(expr substr $(uname -s) 1 6)" == "CYGWIN" ];then
    echo Cygwin rulez
else 
    echo Unix is king
fi

Se i 6 primi caratteri del comando uname -s sono "CYGWIN", si presume un sistema cygwin





bash ssl openssl certificate