Un certificado SSL expirado provoca que los navegadores muestren una advertencia de seguridad a página completa, bloqueando el acceso de los visitantes a tu sitio. A continuación te explicamos cómo verificar cuándo expira tu certificado y cómo configurar el monitoreo.
Verificar desde tu navegador
- Visita tu sitio con
https:// - Haz clic en el icono de candado en la barra de direcciones
- Haz clic en «Certificado» o «La conexión es segura» → «El certificado es válido»
- Busca la fecha de «Válido hasta» o «Expira el»
Verificar con OpenSSL (línea de comandos)
Verificación remota (desde cualquier máquina)
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -enddate
Resultado: notAfter=Aug 5 12:00:00 2026 GMT
Verificación de archivo local
openssl x509 -noout -enddate -in /etc/ssl/gethttps/fullchain.pem
Verificar todos los detalles a la vez
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
Verificar con un script de una línea
Comprueba si un certificado expira dentro de 30 días:
if openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -checkend 2592000 > /dev/null 2>&1; then
echo "Certificate is valid for at least 30 more days"
else
echo "WARNING: Certificate expires within 30 days!"
fi
Verificar múltiples dominios a la vez
Si administras varios dominios, puedes verificarlos todos en un bucle:
for domain in example.com www.example.com api.example.com; do
expiry=$(echo | openssl s_client -connect "$domain":443 -servername "$domain" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
echo "$domain — expires: $expiry"
done
Monitoreo automatizado con cron
Crea una tarea cron diaria que te envíe un correo cuando un certificado esté a menos de 30 días de expirar:
#!/bin/bash
# Save as /usr/local/bin/check-ssl-expiry.sh
DOMAINS="example.com www.example.com api.example.com"
WARN_DAYS=30
WARN_SECS=$((WARN_DAYS * 86400))
for domain in $DOMAINS; do
if ! echo | openssl s_client -connect "$domain":443 -servername "$domain" 2>/dev/null | \
openssl x509 -noout -checkend $WARN_SECS > /dev/null 2>&1; then
echo "WARNING: $domain certificate expires within $WARN_DAYS days" | \
mail -s "SSL Expiry Warning: $domain" admin@example.com
fi
done
Añadir a crontab: 0 9 * * * /usr/local/bin/check-ssl-expiry.sh
Configurar servicios de monitoreo
Para un enfoque más robusto, usa un servicio de monitoreo:
| Método | Cómo | Costo | Opciones de alerta |
|---|---|---|---|
| Recordatorio en calendario | Configurar 60 días después de la emisión | Gratis | Manual |
| Script cron | Ejecutar el script de verificación diariamente | Gratis | Correo electrónico |
| UptimeRobot | Añadir monitor SSL, configurar umbral de alerta | Nivel gratuito | Correo, Slack, webhook |
| Better Uptime | Monitoreo SSL con gestión de incidentes | Nivel gratuito | Correo, SMS, Slack |
| Renovación automática con Certbot | certbot renew vía systemd timer | Gratis | Previene el vencimiento por completo |
Para los certificados de 90 días de Let’s Encrypt, renueva en el día 60 (margen de 30 días).
¿Qué detalles del certificado debo verificar?
Además de la fecha de vencimiento, verifica periódicamente:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -text | grep -E 'Subject:|Issuer:|Not After|DNS:'
Esto muestra:
- Subject/SAN — el certificado cubre los dominios correctos
- Issuer — emitido por la CA esperada (por ejemplo, Let’s Encrypt)
- Not After — fecha de vencimiento
- DNS names — todos los nombres de dominio en el campo SAN
Preguntas frecuentes
¿Qué sucede cuando un certificado expira?
Los navegadores muestran una advertencia a página completa como «Tu conexión no es privada» (Chrome) o «Advertencia: riesgo potencial de seguridad» (Firefox). La mayoría de los visitantes abandonarán el sitio inmediatamente. Los motores de búsqueda también pueden bajar de posición o desindexar tus páginas hasta que se renueve el certificado.
¿Con qué frecuencia debo verificar?
Si tienes renovación automática (Certbot), verifica mensualmente como red de seguridad. Si renuevas manualmente (GetHTTPS), verifica en el día 50 y configura un recordatorio firme en el día 60. Con la validez de 47 días que llegará en 2029, el monitoreo se vuelve aún más crítico.
¿Puedo verificar el vencimiento sin acceso a la línea de comandos?
Sí. Herramientas en línea como SSL Labs Server Test y SSL Checker de SSL Shopper muestran los detalles del certificado, incluyendo las fechas de vencimiento; solo ingresa tu dominio. Las DevTools del navegador también lo muestran (icono de candado → Detalles del certificado).
¿Qué pasa si mi certificado ya expiró?
Renuévalo inmediatamente. Visita GetHTTPS para obtener un nuevo certificado, reemplaza los archivos en tu servidor y recarga el servidor web. El proceso toma 5 minutos. No hay penalización por dejar que un certificado expire; simplemente renueva e instala el nuevo.
¿Puedo monitorear múltiples dominios desde un solo script?
Sí. Aquí tienes un script que verifica todos tus dominios y muestra los días restantes:
#!/bin/bash
for domain in example.com www.example.com api.example.com; do
expiry=$(echo | openssl s_client -connect "$domain":443 -servername "$domain" 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
days_left=$(( ($(date -d "$expiry" +%s) - $(date +%s)) / 86400 ))
if [ "$days_left" -lt 30 ]; then
echo "WARNING $domain: $days_left days left"
else
echo "OK $domain: $days_left days left"
fi
done
Nota: La sintaxis date -d es específica de Linux. En macOS, usa date -j -f "%b %d %H:%M:%S %Y %Z".