Come determinare la data di scadenza del certificato SSL da un certificato codificato PEM?


327

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

Risposte:


630

Con openssl:

openssl x509 -enddate -noout -in file.pem

L'output è nel modulo:

notAfter=Nov  3 22:23:50 2014 GMT

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


19
Hai anche le opzioni -startdatee -enddateintegrate x509nell'utilità. Ti salveranno il grep.
JWW

2
questo funziona anche se il file non è in formato pem. funziona bene per server.crt
guarda il

163

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

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

Ciò consente di evitare di dover confrontare personalmente data / ora.

opensslrestituirà un codice di uscita di 0(zero) se il certificato non è scaduto e non lo farà per i successivi 86400 secondi, nell'esempio sopra. 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, presuppone che l'ora / la data siano impostate correttamente)


8
Per determinare se un certificato è attualmente scaduto, utilizzare una durata di zero secondi. Ometti l' -nooutopzione per visualizzare un messaggio utile utilizzando un singolo comando senza ulteriore logica. Ad esempio, openssl x509 -checkend 0 -in file.pemdarà l'output "Il certificato scadrà" o "Il certificato non scadrà" indicando se il certificato scadrà tra zero secondi.
LS

1
Grazie! Questo è esattamente quello di cui avevo bisogno! Con i codici di uscita, renderà un programma molto più piccolo / più pulito.
Lon Kaut,

24

Ecco la mia riga di comando bash per elencare più certificati in ordine di scadenza, con la scadenza più recente per 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 campione:

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

Molto bella! Questo è quello che stavo cercando. Ora ho una panoramica dei certificati che dovrò rinnovare presto. L'ho salvato come checkcerts.sh nella mia cartella home in modo da poterlo controllare regolarmente. La prossima cosa sarebbe avere un lavoro CRON da controllare ogni mese e inviare per e-mail i certificati che devono essere rinnovati.
Pete,

3
Molto utile grazie. Uso questo cronjob0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Matthieu

10

Ecco una funzione bash che controlla tutti i tuoi server, supponendo che tu stia utilizzando il round robin DNS. Nota che questo richiede la data 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 output:

$ 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

sorprendentemente osx 10.13.4 corre propria shell OK (non giudicarmi io sono solo oggi osx per spingere un app per app store ... l'avvio di nuovo a linux breve ;-)
Scott Stensland

1
@ScottStensland Stiamo giudicando :-P. Uso molto Mac ma Linux è davvero molto meglio.
Mike Q,

Grazie mille per questo frammento di codice! Che compito fastidioso :), vorrei che ci fosse un flag timestamp univoco per openssl.
user1279741

1
Per quelli di voi su un container Linux alpino, il expiry_datevalore dovrà avere il nome del fuso orario rimosso dalla fine di esso. Aggiungi un ulteriore cutalla fine del tubo per fare questo:| cut -d ' ' -f 1-4
Droogans

5

Una riga verifica su vero / falso se il certificato di dominio scadrà dopo qualche tempo (es. 15 giorni):

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

2

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 campione:

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

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


Come faresti se non avessi creato i file .pem, ma avessi solo .cercertificati che hai appena creato e scaricato dal sito Apple Dev?
Alex Zavatone,

1

Come la risposta accettata, ma nota che funziona anche con .crtfile e non solo .pemfile, nel caso in cui non riesci a trovare la .pemposizione del file.

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Risultato:

notAfter=Mar 29 06:15:00 2020 GMT

0

Se (per qualche motivo) vuoi usare un'applicazione GUI in Linux, usa gcr-viewer(nella maggior parte delle distribuzioni è installato dal pacchetto gcr(altrimenti nel pacchetto gcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.