script para verificar si el certificado SSL es válido

14

Tengo varios certificados SSL y me gustaría recibir una notificación cuando un certificado haya expirado.

Mi idea es crear un cronjob, que ejecuta un comando simple todos los días.

Sé que el opensslcomando en Linux se puede usar para mostrar la información del certificado del servidor remoto, es decir:

openssl s_client -connect www.google.com:443

Pero no veo la fecha de vencimiento en esta salida. Además, tengo que terminar este comando con CTRL+ c.

¿Cómo puedo verificar la caducidad de un certificado remoto de un script (preferiblemente usando openssl) y hacerlo en "modo por lotes" para que se ejecute automáticamente sin interacción del usuario?

Martin Vegter
fuente
44
También recomendaría enviar el nombre del servidor con los -servername www.google.comservidores habilitados para SNI. Para evitar la necesidad de la terminación, envíe / dev / null< /dev/null
syss
Si está ejecutando Red Hat / CentOS / Fedora, eche un vistazo a certmonger . También está disponible en los repositorios estándar.
JRFerguson
Agregaría la verificación del certificado en una herramienta de monitoreo como nagios o icinga.
sebix

Respuestas:

18

Su comando ahora esperaría una solicitud http como, GET index.phppor ejemplo. Use esto en su lugar:

if true | openssl s_client -connect www.google.com:443 2>/dev/null | \
  openssl x509 -noout -checkend 0; then
  echo "Certificate is not expired"
else
  echo "Certificate is expired"
fi

  • true: simplemente no dará ninguna entrada seguida de eof, de modo que openssl salga después de conectarse.
    • openssl ...: el comando de tu pregunta
    • 2>/dev/null: la salida de error será ignorada.
  • openssl x509: activa la gestión de datos del certificado X.509.
    • Esto se leerá de entrada estándar por defecto
    • -noout: Suprime toda la salida del certificado
    • -checkend 0: compruebe si el certificado caducó en los próximos 0 segundos
caos
fuente
-checkend¡mucho más fácil que el script que encontré que hacía aritmética de fechas!
Auspex
7

Te da el certificado, pero no lo decodifica. Como eso sería necesario si quieres la fecha, no la ves. Entonces, lo que se necesita es que lo conecte a la x509aplicación de OpenSSL para decodificar el certificado:

openssl s_client -connect www.example.com:443 \
    -servername www.example.com </dev/null |\
    openssl x509 -in /dev/stdin -noout -text

Esto le dará el certificado descodificado completo en stdout, incluidas sus fechas de validez.

Wouter Verhelst
fuente
3

Si necesita verificar la fecha de vencimiento, gracias a esta publicación de blog , encontró una manera de encontrar esta información con otra información relevante con una sola llamada:

echo | openssl s_client -servername unix.stackexchange.com -connect unix.stackexchange.com:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates

El resultado incluye el emisor, el sujeto (a quien se expide el certificado), la fecha de emisión y finalmente la fecha de vencimiento :

issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
subject= /C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com
notBefore=May 21 00:00:00 2016 GMT
notAfter=Aug 14 12:00:00 2019 GMT
Robert Lujo
fuente