Certificado SSL caducado o no válido

Cuando el navegador bloquea la web por certificado, revisa caducidad, cobertura de dominio y el modo SSL del CDN.

Síntoma y contexto

El visitante ve tu conexión no es privada, ERR_CERT_DATE_INVALID, ERR_CERT_AUTHORITY_INVALID o el nombre del dominio no coincide. En Cloudflare pueden aparecer 525 SSL Handshake Failed o 526 Invalid SSL Certificate en lugar de tu página. Los certificados TLS tienen fecha de fin; Let's Encrypt emite cada 90 días y depende de renovación automática. Si el cron falló, el hosting cambió o migraste sin reinstalar certbot, el sitio se cae en HTTPS aunque el servidor siga encendido.

Esta guía profundiza en SSL. Para diagnóstico general de caídas mezclando DNS y origen, usa la web no carga. Para bucles tras forzar HTTPS, demasiadas redirecciones.

Causas probables

  1. Certificado expirado. Renovación automática desactivada o tarea cron que dejó de ejecutarse tras migración.
  2. Dominio no incluido en el cert. Cert solo para www pero entras por apex, o subdominio nuevo sin SAN.
  3. Origen sin cert con Cloudflare Full (strict). Cloudflare exige cert válido en el servidor de origen.
  4. Certificado de staging o autofirmado en producción. Quedó un cert de prueba tras deploy.
  5. Cadena intermedia incompleta. Algunos clientes antiguos fallan; navegadores modernos suelen mostrar error distinto.
  6. Reloj del servidor mal. Raro en hosting gestionado; la validez del cert depende de hora correcta en el servidor.

Checklist copiable

SSL - [tu-dominio.com]
Fecha: ___________

1. ERROR VISIBLE
   [ ] ERR_CERT_DATE_INVALID (caducado)
   [ ] Nombre no coincide
   [ ] 525 / 526 Cloudflare
   [ ] Otro: ___________

2. CERTIFICADO (openssl o navegador)
   Expira: ___________
   Emitido para: ___________

3. INFRAESTRUCTURA
   [ ] Let's Encrypt / certbot
   [ ] Cert del hosting (cPanel, Plesk)
   [ ] Cloudflare proxy: Sí / No
   Modo SSL Cloudflare: ___________

4. RENOVACIÓN
   [ ] cron / tarea automática activa
   Último error en log: ___________

5. TRAS RENOVAR
   [ ] Probado https:// y https://www/
   [ ] Incógnito sin error

Qué capturar antes de escribir

Captura del error del navegador con fecha y URL exacta. Salida de:

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

Si usas Cloudflare, captura del modo SSL y si el origen tiene certificado de origen o Let's Encrypt en el servidor. No envíes claves privadas del certificado.

Renovación según entorno

Let's Encrypt en VPS propio

Prueba renovación en seco: certbot renew --dry-run. Si falla, lee el log en /var/log/letsencrypt/. Causas habituales: puerto 80 cerrado durante desafío HTTP-01, DNS que no apunta al servidor, o límite de rate de Let's Encrypt por demasiados intentos fallidos.

Hosting con panel (cPanel, Plesk)

Busca SSL/TLS → certificados. Muchos hostings renuevan Let's Encrypt solos si el dominio apunta correctamente. Si hay botón Renovar, úsalo en horario de poco tráfico.

Cloudflare como proxy

Entre visitante y Cloudflare el cert lo gestiona Cloudflare (válido). El 525/526 suele ser fallo entre Cloudflare y origen. Opciones: instalar cert válido en origen, usar Cloudflare Origin Certificate (válido solo entre CF y origen), o modo Full strict con Let's Encrypt en el servidor.

Sitio estático (Cloudflare Pages, GitHub Pages)

El TLS lo termina la plataforma. Si ves error de cert, revisa dominio custom bien configurado en el panel y que los registros DNS son los que pide la plataforma. No necesitas certbot en tu máquina.

Errores frecuentes al renovar

Rate limit de Let's Encrypt: demasiados intentos fallidos en una semana bloquean nuevas emisiones. Espera o usa el entorno de staging para pruebas (--staging) sin gastar cuota de producción.

Puerto 80 cerrado: el desafío HTTP-01 necesita que Let's Encrypt alcance tu servidor por http en el puerto 80. Si un firewall o el proveedor bloquea 80, usa desafío DNS-01 con API del registrador (más técnico pero funciona con origen cerrado).

Varios servidores con el mismo dominio: renovar en uno no actualiza el otro. El balanceador puede servir un nodo con cert viejo. Unifica o automatiza renovación en todos los nodos.

Mixed content tras renovar

A veces el certificado ya es válido pero el candado sigue roto porque la página carga imágenes, scripts o CSS por http://. Abre la consola del navegador y busca avisos Mixed Content. Corrige URLs a https o rutas relativas. En WordPress, plugins de SSL pueden reescribir enlaces en base de datos; haz copia antes si tocas producción.

Navegador vs Cloudflare 525/526: no es lo mismo

  • Error del navegador (ERR_CERT_DATE_INVALID, nombre no coincide, autoridad no válida): el visitante ve el problema del certificado en la conexión que termina en su cliente. Suele ser el cert del sitio (o del CDN) caducado, incompleto o para otro dominio.
  • Error 525 SSL Handshake Failed: Cloudflare no completa el handshake TLS con el origen. El visitante ya habla bien con Cloudflare; el fallo está detrás. Guía dedicada: error 525 Cloudflare.
  • Error 526 Invalid SSL Certificate: Cloudflare en Full (strict) rechaza el certificado del origen (caducado, autofirmado, nombre incorrecto). Renueva o instala un cert válido en origen, o un Origin Certificate de Cloudflare.
  • Error 522: no es SSL: el origen no responde a tiempo. Ver error 522 Cloudflare.

Clasificar el código evita renovar el cert del edge cuando el problema es el origen, o pelear con Full strict cuando el navegador solo muestra un cert caducado en un sitio sin proxy.

certbot: fallos habituales al renovar

Si usas Let's Encrypt en un VPS, el síntoma “cert caducado” casi siempre es renovación automática rota. Prueba en seco y lee el log:

sudo certbot renew --dry-run
sudo tail -n 80 /var/log/letsencrypt/letsencrypt.log

Causas frecuentes: puerto 80 cerrado (HTTP-01), DNS que ya no apunta a este servidor, cron o timer systemd desactivado tras una migración, y rate limit por demasiados intentos fallidos. La guía Let's Encrypt no renueva profundiza en timers, DNS-01 y límites. No pegues claves privadas ni el contenido de /etc/letsencrypt/live/ en el formulario: basta el mensaje de error del dry-run.

Origin Certificate de Cloudflare

Si Cloudflare hace de proxy (nube naranja) y el origen es un VPS o hosting propio, puedes instalar un Origin Certificate emitido por Cloudflare. Ese cert es válido entre Cloudflare y tu servidor; no lo uses para exponer el origen directamente a Internet sin proxy. Combínalo con modo Full (strict). Si el origen es Cloudflare Pages o similar, la plataforma gestiona el TLS del visitante y no necesitas Origin Certificate en tu máquina.

Checklist mixed content (candado roto con cert válido)

MIXED CONTENT - [URL]
Fecha: ___________

1. Consola del navegador
   [ ] Avisos Mixed Content listados
   Recursos http:// encontrados:
   ___________

2. Origen de las URLs
   [ ] Hardcodeadas en plantilla
   [ ] Base de datos / CMS
   [ ] CDN o plugin de caché

3. Corrección
   [ ] Cambié a https:// o //
   [ ] Purgé caché CDN / plugin
   [ ] Probé en incógnito

Cuándo escalar

Escala si certbot renew falla tras tres intentos con mensaje que no entiendes, si 526 persiste con Full strict y cert recién emitido, o si mezclas varios subdominios y no sabes qué cert reemitir. Categoría Web o despliegue.

Relacionado: La web no carga, Error 525 Cloudflare, Let's Encrypt no renueva, Demasiadas redirecciones, Error deploy Cloudflare Pages.

¿Sigues atascado después de la checklist?

Escribir el problema Volver al triage