Risposte:
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.
Se vuoi solo sapere se il certificato è scaduto (o lo farà entro i prossimi N secondi), l' -checkend <seconds>
opzione per openssl x509
dirti:
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.
openssl
restituirà 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)
-noout
opzione per visualizzare un messaggio utile utilizzando un singolo comando senza ulteriore logica. Ad esempio, openssl x509 -checkend 0 -in file.pem
darà l'output "Il certificato scadrà" o "Il certificato non scadrà" indicando se il certificato scadrà tra zero secondi.
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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
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
expiry_date
valore dovrà avere il nome del fuso orario rimosso dalla fine di esso. Aggiungi un ulteriore cut
alla fine del tubo per fare questo:| cut -d ' ' -f 1-4
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
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-8601
sul mio sistema.
.cer
certificati che hai appena creato e scaricato dal sito Apple Dev?
Come la risposta accettata, ma nota che funziona anche con .crt
file e non solo .pem
file, nel caso in cui non riesci a trovare la .pem
posizione del file.
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Risultato:
notAfter=Mar 29 06:15:00 2020 GMT
-startdate
e-enddate
integratex509
nell'utilità. Ti salveranno ilgrep
.