Seguridad / Administración Web 8 min lectura

HTTPS con Let's Encrypt y Certbot en Nginx: guía completa con redirección, renovación automática y solución de errores

Configura SSL/TLS gratuito en tu servidor Nginx con Certbot y Let's Encrypt. Aprende a forzar HTTPS, automatizar la renovación de certificados, solucionar errores comunes y aplicar configuraciones seguras de TLS. Todo paso a paso y listo para producción.

Por Equipo Starbyte

HTTPS con Let's Encrypt y Certbot en Nginx: guía completa con redirección, renovación automática y solución de errores

HTTPS con Let's Encrypt y Certbot en Nginx: guía completa con redirección, renovación automática y solución de errores

Problema real: Tienes un sitio web servido con Nginx, pero solo bajo HTTP. Los navegadores lo marcan como "No seguro", pierdes visitantes y posicionamiento SEO. Instalar un certificado SSL de pago es innecesario para la mayoría de los proyectos, pero configurar Let's Encrypt manualmente cada 90 días es tedioso y propenso a olvidos. Necesitas un flujo automático, robusto y que fuerce HTTPS en todo el tráfico.

Esta guía te entrega exactamente eso: desde cero, configurar Certbot con Nginx, obtener tu primer certificado, asegurar la renovación automática y dejar tu sitio perfectamente protegido.


Requisitos previos

  • Servidor Ubuntu 20.04/22.04/24.04 con acceso root o sudo.
  • Nginx instalado y funcionando (sudo apt install nginx).
  • Un nombre de dominio que apunte (registro A) a la IP pública del servidor.
  • Los puertos 80 y 443 abiertos en el firewall.
  • (Recomendado) ssh configurado y snapd presente si prefieres la versión snap de Certbot (la oficial).

1. Instalación de Certbot y el plugin de Nginx

La forma recomendada por Let's Encrypt es usar el paquete snap de Certbot. Si ya tienes snapd, sigue estos pasos:

sudo apt update
sudo apt install snapd -y
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Ahora instala el plugin específico para Nginx:

sudo apt install python3-certbot-nginx -y

Verifica la instalación:

certbot --version

2. Configuración previa de Nginx (bloque de servidor)

Asegúrate de que Nginx esté sirviendo tu dominio en el puerto 80. Crea o edita un archivo de configuración en /etc/nginx/sites-available/tudominio.com:

server {
    listen 80;
    server_name tudominio.com www.tudominio.com;

    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

Habilita el sitio (si es nuevo):

sudo ln -s /etc/nginx/sites-available/tudominio.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Comprueba que tu dominio responde HTTP correctamente antes de seguir.


3. Obtener el certificado SSL

Ejecuta el comando interactivo de Certbot:

sudo certbot --nginx

Te preguntará:

  • Correo electrónico (para avisos de expiración).
  • Aceptar términos de servicio.
  • Si deseas compartir tu correo con la EFF (opcional).
  • Qué dominios quieres activar (los que encuentre en la configuración de Nginx). Normalmente aparecen todos en una lista numerada; puedes dejar en blanco para todos.
  • Si quieres redirigir automáticamente HTTP a HTTPS: elige 2 (redirección automática).

Esto modificará tu archivo de configuración Nginx, añadiendo las líneas necesarias para SSL y la redirección.

Si prefieres hacerlo de manera no interactiva (útil en scripts):

sudo certbot --nginx --non-interactive --agree-tos --email admin@tudominio.com --domains tudominio.com,www.tudominio.com --redirect

4. Configuración resultante y comprobación

Después de ejecutar Certbot, tu archivo de configuración se verá similar a esto:

server {
    server_name tudominio.com www.tudominio.com;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    if ($host = www.tudominio.com) {
        return 301 https://$host$request_uri;
    }
    if ($host = tudominio.com) {
        return 301 https://$host$request_uri;
    }

    listen 80;
    server_name tudominio.com www.tudominio.com;
    return 404;
}

Verifica la sintaxis y recarga:

sudo nginx -t && sudo systemctl reload nginx

Accede a https://tudominio.com; verás el candado. Puedes auditar tu configuración TLS con:

curl -sL https://www.ssllabs.com/ssltest/analyze.html?d=tudominio.com

5. Renovación automática

Certbot instala automáticamente un timer de systemd que se ejecuta dos veces al día. Comprueba que está activo:

sudo systemctl list-timers certbot.timer

Para probar manualmente la renovación (sin forzarla):

sudo certbot renew --dry-run

Si no hay errores, la renovación se hará en los próximos 30 días antes de expirar. El comando real que se ejecuta diariamente es certbot renew, que procesa todos los certificados y solo renueva los próximos a vencer. Nginx se recarga automáticamente después porque el hook por defecto está en la configuración de renovación.

Puedes ver los hooks editando (no es necesario normalmente) /etc/letsencrypt/renewal/tudominio.com.conf; al final verás renew_hook = systemctl reload nginx.


6. Errores frecuentes y soluciones

Error Causa Solución
Could not automatically find a matching server block for tudominio.com No existe un bloque de servidor en Nginx con ese dominio Crea o ajusta el archivo de configuración con server_name tudominio.com y recarga Nginx antes de ejecutar Certbot.
Failed authorization procedure ... 403 o timeout Let's Encrypt no puede acceder al archivo de desafío .well-known/acme-challenge en tu servidor (puerto 80 no abierto, o Nginx mal configurado) Asegura que el firewall permita tráfico HTTP (puerto 80). Verifica que Nginx esté sirviendo el dominio y que no haya reglas que bloqueen el directorio .well-known.
Connection refused en el paso de desafío Nginx no está corriendo o escucha solo en localhost Revisa listen 80; y que esté asociado a la IP pública. Ejecuta `ss -tulpn
The client lacks sufficient authorization Límite de peticiones excedido (5 por dominio por semana) Espera a que pase el límite o usa el entorno de staging para pruebas: añade --dry-run o --test-cert.
El sitio carga HTTP sin redirigir a HTTPS Elegiste la opción 1 (sin redirección) durante la configuración inicial Vuelve a ejecutar sudo certbot --nginx --redirect o manualmente añade el bloque de redirección 301 en el puerto 80.
certbot renew falla con error de conexión Problema de red o DNS Comprueba que desde el servidor se pueda resolver el dominio y que el puerto 80 esté accesible desde el exterior.

7. Casos prácticos de uso

7.1 Certificado único para múltiples dominios (SAN)

Si tienes varios dominios o subdominios en el mismo servidor, puedes obtener un solo certificado con todos ellos:

sudo certbot --nginx -d dominio1.com -d www.dominio1.com -d api.dominio1.com

Esto incluye todos los nombres en el mismo certificado y la redirección se aplica según estén configurados en Nginx.

7.2 Certificado wildcard (requiere validación DNS)

Para proteger *.tudominio.com necesitas un desafío DNS, no HTTP. Instala el plugin de tu proveedor DNS (ej. Cloudflare):

sudo apt install python3-certbot-dns-cloudflare

Crea un archivo de credenciales (protegido) y ejecuta:

sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /ruta/credenciales.ini -d tudominio.com -d *.tudominio.com

Luego configura Nginx manualmente apuntando a los certificados en /etc/letsencrypt/live/tudominio.com/.

7.3 Configuración TLS avanzada para máxima seguridad

Edita el archivo de opciones SSL incluido por Certbot (/etc/letsencrypt/options-ssl-nginx.conf) y personaliza:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;

Recarga Nginx. Puedes probar tu configuración con la herramienta SSL Labs.


8. Buenas prácticas

  • No modifiques manualmente los archivos de renovación dentro de /etc/letsencrypt/renewal/ a menos que sepas lo que haces. Cualquier cambio puede romper la renovación automática.
  • Usa siempre --dry-run al probar renovaciones para no exceder los límites de Let's Encrypt.
  • Respaldar /etc/letsencrypt periódicamente, especialmente después de añadir nuevos certificados. Incluye las claves privadas; sin ellas no podrás restaurar.
  • Implementa HSTS una vez que verifiques que HTTPS funciona correctamente. Añade en tu bloque SSL:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
  • Monitoriza la expiración incluso con renovación automática. Puedes usar un check externo como UptimeRobot en la raíz HTTPS y un script simple que lea certbot certificates.
  • Si migras de servidor, copia /etc/letsencrypt con cuidado y restaura la configuración de Nginx exacta. Los certificados son transferibles.

9. Cierre con idea clave

No hay excusa para que un sitio web moderno carezca de HTTPS. Con Let's Encrypt y Certbot, dispones de una capa de seguridad profesional, gratuita y que se mantiene a sí misma sin intervención manual. Configúralo una vez y olvídate de los avisos de "sitio no seguro" para siempre.

Etiquetas: #https #ssl #lets-encrypt #certbot #nginx #seguridad-web