¿Cómo determinar la fecha de vencimiento del certificado SSL a partir de un certificado codificado PEM?

327

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

GL2014
fuente

Respuestas:

630

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 expirado o no, o si lo hará dentro de un cierto período de tiempo, sin tener que analizar la fecha anterior.

ese otro chico
fuente
19
También tiene las opciones -startdatey -enddateincorporadas en la x509utilidad. Te salvarán el grep.
jww
2
esto también funciona si el archivo no está en formato pem. funciona bien para server.crt
mire el
163

Si solo desea saber si el certificado ha expirado (o lo hará dentro de los próximos N segundos), la -checkend <seconds>opción openssl x509le 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 usted mismo.

openssldevolverá un código de salida de 0(cero) si el certificado no ha expirado y no lo hará durante los siguientes 86400 segundos, en el ejemplo anterior. Si el certificado habrá expirado 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, supone que la hora / fecha está configurada correctamente)

MikeW
fuente
8
Para determinar si un certificado ha caducado actualmente, use una duración de cero segundos. Omita la -nooutopción de ver un mensaje útil utilizando un solo comando sin lógica adicional. Por ejemplo, openssl x509 -checkend 0 -in file.pemdará el resultado "El certificado caducará" o "El certificado no caducará", indicando si el certificado caducará en cero segundos.
LS
1
¡Gracias! ¡Esto es exactamente lo que necesitaba! Con los códigos de salida, se creará un programa mucho más pequeño / más limpio.
Lon Kaut
24

Aquí está mi línea de comando bash para enumerar varios certificados en orden de vencimiento, el último que expiró 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
Nicholas Sushkin
fuente
¡Muy agradable! Esto es lo que buscaba. Ahora tengo una visión general de los certificados que tengo que renovar pronto. Lo guardé como checkcerts.sh en mi carpeta de inicio para que pueda verificarlo regularmente. Lo siguiente sería tener un trabajo CRON para verificar cada mes y enviar por correo electrónico los certificados que necesitan renovación.
Pete
3
Muy útil gracias. Yo uso este cronjob0 7 * * 1 /path/to/cert.sh | mail -s "certbot" [email protected]
Matthieu
10

Aquí hay una función bash que verifica todos sus servidores, suponiendo que esté usando DNS round-robin. Tenga en cuenta que esto requiere una fecha 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 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
Andrés
fuente
sorprendentemente OSX 10.13.4 corre su shell bien (no me juzgues no soy más que a día de hoy OSX para empujar una aplicación de tienda de aplicaciones ... arrancar de nuevo a linux poco ;-)
de Scott Stensland
1
@ScottStensland Estamos juzgando :-P. Yo uso mucho Mac pero Linux es realmente mucho mejor.
Mike Q
¡Muchas gracias por ese fragmento de código! Qué tarea molesta :), desearía que hubiera un indicador de marca de tiempo unixtime para openssl.
user1279741
1
Para aquellos de ustedes en un contenedor de Linux alpino, su expiry_datevalor deberá tener el nombre de la zona horaria eliminado del final. Agregue un adicional cutal final de la tubería para hacer esto:| cut -d ' ' -f 1-4
Droogans
5

Una línea verificando verdadero / falso si el certificado de dominio expirará en algún momento más tarde (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
Alexey
fuente
2

Para MAC OSX (El Capitan) 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 gustaban las banderas --date=o --iso-8601en mi sistema.

Donald.M
fuente
¿Cómo harías esto si no hubieras hecho los archivos .pem, pero solo .certuvieras certificados que acabas de hacer y descargar del sitio Apple Dev?
Alex Zavatone
1

Igual que la respuesta aceptada, pero tenga en cuenta que funciona incluso con el .crtarchivo y no solo con el .pemarchivo, por si acaso no puede encontrar .pemla ubicación del archivo.

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Resultado:

notAfter=Mar 29 06:15:00 2020 GMT
Srihari Karanth
fuente
0

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

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