validate valid how expiration check bash ssl openssl certificate

bash - valid - ¿Cómo determinar la fecha de vencimiento del certificado SSL de un certificado codificado PEM?



openssl check if certificate is valid (7)

Aquí está mi línea de comando de bash para enumerar varios certificados en orden de caducidad, la más reciente caducó primero.

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

Salida de muestra:

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

Si tengo el archivo real y un shell Bash en Mac o Linux, ¿cómo puedo consultar el archivo cert para saber cuándo caducará? No es un sitio web, sino el archivo de certificado en sí mismo, asumiendo que tengo los archivos csr, key, pem y chain.


Aquí hay una función de bash que verifica todos sus servidores, asumiendo que está usando DNS round-robin. Tenga en cuenta que esto requiere la fecha de GNU y no funcionará en 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 }

Ejemplo de salida:

$ 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


Para MAC OSX (El Capitán) Esta modificación del ejemplo de Nicholas me funcionó.

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

Salida de muestra:

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

A macOS no le --date= las --date= o --iso-8601 en mi sistema.


Si (por alguna razón) desea usar una aplicación GUI en Linux, use gcr-viewer (en la mayoría de las distribuciones está instalado por el paquete gcr (de lo contrario, en el paquete gcr-viewer ))

gcr-viewer file.pem # or gcr-viewer file.crt


Si solo desea saber si el certificado ha caducado (o lo hará en los próximos N segundos), la -checkend <seconds> a openssl x509 le indicará:

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

Esto ahorra tener que hacer comparaciones de fecha / hora a ti mismo.

openssl devolverá un código de salida de 0 (cero) si el certificado no ha caducado y no lo hará durante los siguientes 86400 segundos, en el ejemplo anterior. Si el certificado ha caducado o ya lo ha hecho, o algún otro error como un archivo no válido / inexistente, el código de retorno es 1 .

(Por supuesto, asume que la hora / fecha está configurada correctamente)


Una línea marcando verdadero / falso si el certificado expiró algún tiempo después (por ejemplo, 15 días):

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


Con openssl :

openssl x509 -enddate -noout -in file.pem

La salida está en el formulario:

notAfter=Nov 3 22:23:50 2014 GMT

También vea la respuesta de MikeW sobre cómo verificar fácilmente si el certificado ha caducado o no, o si lo hará dentro de un cierto período de tiempo, sin tener que analizar la fecha anterior.