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 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 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 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 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 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 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
-servernamepuedes 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 -des solo de GNU. En macOS necesitasdate -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
- Medir la latencia de una API con curl
- Comprobar si un puerto está abierto en un servidor remoto
- Triaje de red en lenguaje llano
Deja de escribir a mano comandos de openssl — describe lo que necesitas y CliAI escribe el comando. Instálalo en una línea.