Let's Encrypt no renueva

Cuando el certificado automático falla antes de caducar o ya muestra error SSL: qué revisar en certbot, DNS, firewall y panel.

Síntoma y contexto

Let's Encrypt emite certificados de corta duración y espera que la renovación sea automática. Cuando falla, puedes descubrirlo de dos formas: el navegador empieza a mostrar aviso de certificado caducado, o recibes un aviso previo del panel, certbot o monitorización diciendo que quedan pocos días. En servidores con Cloudflare, el síntoma visible también puede ser un Error 525 si el origen ya no presenta un certificado aceptable.

La renovación no es magia. Let's Encrypt debe comprobar que controlas el dominio mediante un desafío. En HTTP-01, el servidor publica un archivo temporal bajo /.well-known/acme-challenge/ y la autoridad lo visita por HTTP. En DNS-01, se publica un TXT temporal en DNS. Si el dominio apunta a otro servidor, el puerto 80 está cerrado, una redirección intercepta el desafío, el plugin DNS no puede crear el TXT o se agotaron límites por demasiados intentos, la renovación falla.

Esta guía diferencia VPS con certbot de hosting con panel. En un VPS puedes revisar comandos, timers y logs. En cPanel, Plesk u otros paneles, muchas renovaciones las gestiona el proveedor y conviene no instalar certbot paralelo sin entender cómo sirve los vhosts. Para una explicación general del aviso SSL, consulta certificado SSL caducado.

Causas probables

  1. Puerto 80 cerrado para HTTP-01. Un firewall, grupo de seguridad o regla del proveedor impide que Let's Encrypt alcance el desafío por HTTP.
  2. DNS apunta al servidor equivocado. El dominio se migró, pero certbot sigue instalado en el servidor antiguo o el registro A apunta a otra IP.
  3. Cloudflare o CDN interfiere con el desafío. El proxy normalmente puede funcionar, pero reglas de redirect, WAF o cache pueden bloquear /.well-known/acme-challenge/.
  4. Webroot incorrecto. Certbot escribe el archivo de validación en una carpeta distinta a la que nginx o Apache sirve para ese dominio.
  5. Timer systemd o cron desactivado. La emisión manual funcionó, pero la tarea automática no se ejecuta tras una migración o reinstalación.
  6. Plugin DNS-01 sin permisos. El token del proveedor DNS no puede crear o borrar TXT, o el archivo de credenciales cambió de ruta.
  7. Rate limit de Let's Encrypt. Demasiados intentos fallidos o emisiones repetidas para el mismo conjunto de nombres bloquean nuevas pruebas de producción temporalmente.
  8. Panel y certbot gestionan el mismo dominio. Dos sistemas compiten por certificados, rutas y recargas de servidor, dejando instalado un certificado antiguo.

Checklist copiable

LET'S ENCRYPT NO RENUEVA - [dominio]
Fecha: ___________  Hora (zona): ___________

1. CERTIFICADO
   Dominio principal: ___________
   Incluye www: Sí / No / No sé
   Otros SAN: ___________
   Fecha de caducidad: ___________

2. ENTORNO
   [ ] VPS con certbot
   [ ] cPanel / Plesk / panel gestionado
   [ ] Cloudflare delante
   [ ] Otro CDN o proxy
   Servidor web: nginx / Apache / otro / no sé

3. MÉTODO DE VALIDACIÓN
   [ ] HTTP-01
   [ ] DNS-01
   [ ] TLS-ALPN-01
   [ ] No sé

4. PRUEBAS
   [ ] sudo certbot renew --dry-run
   [ ] Puerto 80 accesible desde fuera
   [ ] DNS A / AAAA apunta al origen correcto
   [ ] Timer o cron activo
   [ ] Logs revisados

5. ERROR LITERAL
   Pega aquí el mensaje de dry-run o panel, sin claves:
   ___________

6. NO ENVIAR
   [ ] Sin privkey.pem
   [ ] Sin fullchain.pem completo
   [ ] Sin tokens DNS
   [ ] Sin contraseñas SSH o panel

Qué capturar antes de escribir

Captura la fecha de caducidad del certificado y la lista de nombres que cubre. Si usas certbot, guarda la salida de sudo certbot renew --dry-run y las últimas líneas relevantes de /var/log/letsencrypt/letsencrypt.log. No hace falta pegar certificados completos ni claves privadas. En particular, no compartas privkey.pem, tokens del proveedor DNS ni archivos de credenciales usados por plugins DNS.

Indica si el sitio está detrás de Cloudflare, si el registro está proxificado y si el origen es un VPS propio o un hosting con panel. También es importante saber si el dominio cambió de IP, nameservers o proveedor recientemente. Muchas renovaciones fallan porque certbot intenta validar en una máquina que ya no recibe tráfico para ese dominio.

Si el panel del hosting tiene su propio AutoSSL o Let's Encrypt, captura el error del panel. No instales un segundo sistema de renovación solo para probar. Primero identifica quién debería ser responsable del certificado: el panel, certbot del VPS, la plataforma estática o Cloudflare Origin Certificate.

Comandos y paneles útiles

En un VPS con certbot, estos comandos suelen bastar para separar DNS, renovación y automatización:

# Probar renovación sin emitir certificado real
sudo certbot renew --dry-run

# Ver certificados que certbot conoce
sudo certbot certificates

# Revisar timers systemd
systemctl list-timers | grep certbot
systemctl status certbot.timer

# Revisar log reciente
sudo tail -n 80 /var/log/letsencrypt/letsencrypt.log

# Comprobar DNS del dominio
dig A tudominio.com +short
dig AAAA tudominio.com +short

# Ver cabeceras HTTP para el dominio
curl -I http://tudominio.com

En paneles de hosting, busca secciones como SSL/TLS, Let's Encrypt, AutoSSL, Seguridad o Certificados. En Plesk, revisa el certificado asignado al dominio y la tarea de renovación. En cPanel, AutoSSL puede fallar si el dominio no apunta al servidor, si hay DCV pendientes o si el proveedor limita certificados en cuentas suspendidas.

Pasos por escenario

VPS con certbot y desafío HTTP-01

Ejecuta sudo certbot renew --dry-run. Si el error menciona conexión rechazada o timeout, comprueba firewall, seguridad del proveedor y que nginx o Apache escucha en el puerto 80. No basta con que HTTPS funcione. Para HTTP-01, Let's Encrypt debe poder entrar por http://tudominio.com/.well-known/acme-challenge/.... Si fuerzas redirecciones, asegúrate de que no rompen esa ruta.

DNS apunta a otro servidor

Compara dig A y dig AAAA con la IP del VPS donde corre certbot. Si migraste el sitio a otro hosting, el certbot antiguo ya no puede validar el dominio. Instala o activa el certificado en el servidor nuevo, o mueve la renovación al panel que ahora sirve la web. Cuidado con registros AAAA olvidados: el dominio puede validar por IPv6 hacia una máquina distinta.

DNS-01 con API del proveedor

DNS-01 es útil cuando el puerto 80 no puede abrirse, cuando necesitas wildcard o cuando el origen no es público. El fallo suele estar en permisos del token, ruta del archivo de credenciales o propagación lenta del TXT. Usa el modo de staging para probar. No pegues tokens API en formularios ni tickets. Describe el proveedor DNS y el mensaje de error del plugin.

Rate limits de Let's Encrypt

Si repites emisiones reales sin cambiar la causa, puedes chocar con límites. Cuando estés investigando, usa --dry-run o el entorno de staging. Si ya llegaste a un límite, normalmente toca esperar o ajustar nombres para no seguir golpeando producción. No borres certificados existentes por frustración: podrías perder la última copia funcional.

Timer systemd o cron no se ejecuta

En muchas instalaciones modernas, certbot usa certbot.timer. Comprueba systemctl status certbot.timer y la próxima ejecución con systemctl list-timers. En instalaciones antiguas puede existir cron en /etc/cron.d/ o tareas del panel. Si la renovación manual funciona pero automática no, revisa permisos, PATH, hooks de deploy y recarga de nginx o Apache tras renovar.

Hosting con panel, no VPS

Si usas cPanel, Plesk o un hosting gestionado, el panel suele emitir y renovar certificados. Comprueba que el dominio apunta al hosting y que no hay registros DNS obsoletos. Si Cloudflare está delante, algunos paneles validan igual, pero reglas estrictas pueden interferir. Usa el botón de reemitir del panel si existe y guarda el error. No instales certbot por SSH en una cuenta compartida salvo que el proveedor lo documente.

Cloudflare delante del origen

Cloudflare puede ocultar el certificado del origen al visitante, pero no elimina la necesidad de un origen válido en Full strict. Si el origen caduca, Cloudflare puede mostrar 525 o 526. Opciones: renovar Let's Encrypt en el origen, instalar un Cloudflare Origin Certificate o ajustar temporalmente a Full mientras corriges, si entiendes el riesgo. Para el diagnóstico específico, usa Error 525 Cloudflare.

Cuándo escalar

Escala usando el formulario con categoría Web o despliegue si el dry-run falla y no sabes interpretar el log, si hay conflicto entre panel y certbot, si necesitas pasar de HTTP-01 a DNS-01, si el dominio usa Cloudflare y origen propio, o si el certificado caducó y no puedes abrir el puerto 80. Adjunta salida de dry-run, dominio, proveedor, método de validación y capturas del panel. No adjuntes claves privadas ni tokens.

Enlaces relacionados: Certificado SSL caducado, Error 525 Cloudflare, La web no carga.

¿Sigues atascado después de la checklist?

Escribir el problema Volver al triage