CLI AI

Comprobar cuándo caduca un certificado SSL con openssl

2026-06-27

La forma más rápida de comprobar cuándo caduca un certificado SSL es echo | openssl s_client -servername host -connect host:443 2>/dev/null | openssl x509 -noout -enddate, que imprime la fecha notAfter exacta sin tocar un navegador. A partir de ahí puedes convertir esa fecha en un número de días, montar una comprobación apta para cron, o recorrer una lista entera de dominios de una vez. Este es el flujo completo, no solo el comando que ya todo el mundo conoce.

1. Cuándo caduca el certificado de un sitio

clai
$ clai cuándo caduca el certificado de cliai.tech→ echo | openssl s_client -servername cliai.tech -connect cliai.tech:443 2>/dev/null | openssl x509 -noout -enddate -subjectnotAfter=Nov  2 10:19:50 2026 GMTsubject=CN=cliai.tech

echo | cierra la entrada estándar, si no s_client se queda esperando entrada interactiva. -servername fija el SNI y es obligatorio siempre que una misma IP sirva más de un sitio — que es casi siempre.

2. Cuántos días quedan

clai
$ clai cuántos días quedan para que caduque el certificado de cliai.tech→ exp=$(echo | openssl s_client -servername cliai.tech -connect cliai.tech:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2); echo $(( ($(date -d "$exp" +%s) - $(date +%s)) / 86400 )) days

date -d interpreta el formato de fecha de OpenSSL, y el resto es aritmética normal en segundos. Ese es el número que comparas con un umbral en el monitoreo.

3. Una comprobación sin hacer aritmética

clai
$ clai comprueba si el certificado caduca en los próximos 30 días→ echo | openssl s_client -servername cliai.tech -connect cliai.tech:443 2>/dev/null | openssl x509 -noout -checkend 2592000 && echo "ok" || echo "expires within 30 days"

-checkend recibe segundos y devuelve un código de salida, no texto. 2592000 son 30 días. Lista para meter en un script — no hay nada que parsear.

4. Una lista entera de dominios de una vez

clai
$ clai comprueba el vencimiento de certificados para una lista de dominios de un archivo→ while read d; do printf '%-28s ' "$d"; echo | openssl s_client -servername "$d" -connect "$d":443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2; done < domains.txt

El mismo truco, en bucle. Mantén domains.txt junto al script — actualizar la lista es más fácil que editar el comando.

5. Un archivo de certificado local

clai
$ clai muestra el vencimiento de este archivo de certificado→ openssl x509 -in /etc/ssl/certs/example.pem -noout -dates

Para un archivo ya en disco no hace falta s_client. -dates muestra notBefore y notAfter — el primero importa cuando un certificado se emitió "para el futuro" y aún no es válido.

6. Ver la cadena completa

clai
$ clai muestra la cadena de certificados de este sitio→ echo | openssl s_client -servername cliai.tech -connect cliai.tech:443 -showcerts 2>/dev/null | grep -E 's:|i:'

-showcerts devuelve toda la cadena; las líneas s: son el subject, las i: son el issuer. Una cadena incompleta es una causa habitual de que un sitio cargue bien en el navegador pero falle en curl o en una app móvil.

Trampas

  • Sin -servername puedes comprobar el certificado equivocado. En una IP compartida, un servidor sin SNI devuelve su certificado por defecto, y acabas midiendo el vencimiento de otro sitio.
  • date -d es solo de GNU. En macOS necesitas date -j -f '%b %d %T %Y %Z', con el formato de entrada escrito a mano.
  • El vencimiento del certificado y el del dominio son eventos distintos. Renovar el certificado automáticamente no sirve de nada si el dominio en sí caduca o falla el reto ACME.

Preguntas relacionadas

¿Cómo compruebo un certificado en un puerto no estándar? Cambia el puerto en -connect, por ejemplo -connect mail.example.com:993, y añade -starttls imap para protocolos que actualizan la conexión.

¿Por qué el navegador muestra un certificado válido y curl se queja? Normalmente es una cadena incompleta: el navegador descarga el intermedio que falta por su cuenta, curl no. Revisa la salida de -showcerts.

¿Cómo automatizo la alerta? Pon la versión con -checkend en cron y notifica con un código de salida distinto de cero. Un umbral de 30 días deja margen para reaccionar.

Ver también

Deja de escribir a mano comandos de openssl — describe lo que necesitas y CliAI escribe el comando. Instálalo en una línea.