tutoriales.com

Asegura Nginx con Let's Encrypt: Guía Completa para HTTPS Gratuito y Automatizado

Este tutorial te guiará paso a paso en la configuración de HTTPS en tu servidor Nginx utilizando certificados SSL/TLS gratuitos de Let's Encrypt. Aprenderás a instalar Certbot, obtener certificados, configurar Nginx para usar SSL y automatizar su renovación, garantizando una conexión segura para tus usuarios.

Intermedio20 min de lectura13 views
Reportar error

🛡️ ¿Por Qué HTTPS y Let's Encrypt? La Base de la Seguridad Web

En la era digital actual, la seguridad web es más que una recomendación; es una necesidad. HTTPS (Hypertext Transfer Protocol Secure) es la versión segura del protocolo HTTP, que cifra la comunicación entre el navegador del usuario y el servidor web. Esto protege la información sensible, como credenciales de inicio de sesión, datos personales y transacciones financieras, de ser interceptada por atacantes.

Beneficios Clave del HTTPS:

  • Confianza del Usuario: Los navegadores modernos marcan los sitios HTTP como "no seguros", lo que puede disuadir a los usuarios. HTTPS genera confianza.
  • Integridad de Datos: Garantiza que los datos enviados y recibidos no han sido alterados en tránsito.
  • SEO: Google y otros motores de búsqueda favorecen los sitios HTTPS en sus clasificaciones.
  • Cumplimiento: Muchas regulaciones de privacidad de datos (como GDPR) requieren el uso de HTTPS.
  • Nuevas Funcionalidades: Ciertas funcionalidades web avanzadas (como Service Workers o Geolocation API) requieren un contexto seguro (HTTPS).

Tradicionalmente, obtener certificados SSL/TLS ha sido un proceso costoso y, a veces, complejo. Aquí es donde Let's Encrypt entra en juego. Let's Encrypt es una autoridad de certificación (CA) gratuita, automatizada y abierta, proporcionada por Internet Security Research Group (ISRG). Su objetivo es hacer que HTTPS sea accesible para todos, eliminando barreras financieras y técnicas.

💡 ¿Cómo Funciona Let's Encrypt?

Let's Encrypt utiliza un protocolo llamado ACME (Automated Certificate Management Environment) para verificar la propiedad del dominio y emitir certificados. Herramientas como Certbot automatizan este proceso, facilitando la obtención y renovación de certificados.


📋 Requisitos Previos

Antes de sumergirnos en la configuración, asegúrate de tener lo siguiente:

  • Un servidor Linux (Ubuntu 20.04/22.04, Debian 11/12, CentOS 7/8, Fedora, etc.). Este tutorial se enfocará en sistemas basados en Debian/Ubuntu.
  • Nginx instalado y funcionando. Puedes seguir nuestra guía para instalar Nginx.
  • Un nombre de dominio registrado y apuntando a la dirección IP pública de tu servidor. Por ejemplo, tudominio.com y www.tudominio.com.
  • Acceso SSH a tu servidor con permisos de sudo.
  • El puerto 80 (HTTP) y 443 (HTTPS) deben estar abiertos en tu firewall.
📌 Nota: Es fundamental que tu dominio esté correctamente configurado en el DNS y que apunte a la IP de tu servidor, ya que Let's Encrypt necesita verificar la propiedad del dominio.

🛠️ Paso 1: Configurar Nginx para tu Dominio

Antes de obtener un certificado SSL, Nginx debe estar configurado para servir tu dominio. Si ya tienes una configuración para tu sitio, puedes saltarte este paso.

Creamos un bloque de servidor (server block) básico para nuestro dominio. Este bloque nos permitirá verificar que Nginx está sirviendo correctamente nuestro sitio a través del puerto 80 (HTTP).

  1. Crea el directorio para tu sitio web:
sudo mkdir -p /var/www/tudominio.com/html
  1. Crea un archivo de prueba index.html:
sudo nano /var/www/tudominio.com/html/index.html
Añade el siguiente contenido:
<!DOCTYPE html>
<html>
<head>
<title>¡Hola desde Nginx!</title>
</head>
<body>
<h1>¡Tu sitio Nginx está funcionando!</h1>
<p>Este es el contenido por defecto para tudominio.com</p>
</body>
</html>
  1. Asigna permisos al directorio:
sudo chown -R www-data:www-data /var/www/tudominio.com/html
sudo chmod -R 755 /var/www/tudominio.com
  1. Crea el archivo de configuración de Nginx para tu dominio:
sudo nano /etc/nginx/sites-available/tudominio.com
Añade el siguiente contenido (reemplaza `tudominio.com` con tu dominio real):
server {
listen 80;
listen [::]:80;

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

server_name tudominio.com www.tudominio.com;

location / {
try_files $uri $uri/ =404;
}
}
  1. Habilita el bloque de servidor creando un enlace simbólico:
sudo ln -s /etc/nginx/sites-available/tudominio.com /etc/nginx/sites-enabled/
  1. Prueba la configuración de Nginx y reinicia:
sudo nginx -t
sudo systemctl restart nginx

Ahora, si visitas http://tudominio.com en tu navegador, deberías ver el contenido de tu index.html.


🚀 Paso 2: Instalar Certbot

Certbot es la herramienta cliente recomendada por Let's Encrypt para obtener y renovar certificados. Hay varias maneras de instalar Certbot, pero la forma más recomendada es a través de snapd.

Instalar Snapd (si no está instalado):

En sistemas basados en Debian/Ubuntu:

sudo apt update
sudo apt install snapd

Reinicia el sistema si es necesario, o al menos asegúrate de que el path de snap esté actualizado:

sudo systemctl start snapd
sudo snap install core # Esto asegura que snapd esté completamente actualizado
sudo snap refresh core

Instalar Certbot con Snap:

  1. Remueve cualquier instalación anterior de Certbot:
sudo apt remove certbot
  1. Instala Certbot:
sudo snap install --classic certbot
  1. Crea un enlace simbólico para el comando certbot:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Esto asegura que puedas ejecutar `certbot` desde cualquier lugar en tu terminal.
💡 Consejo: Verificar la versión de Certbot después de la instalación puede ayudarte a confirmar que todo se ha instalado correctamente: certbot --version

🔐 Paso 3: Obtener un Certificado SSL/TLS para Nginx

Ahora que Nginx está configurado y Certbot instalado, podemos obtener los certificados. Certbot puede automáticamente configurar Nginx para usar el certificado.

Ejecuta el siguiente comando (reemplaza tudominio.com y www.tudominio.com con tus dominios reales, y tu_email@ejemplo.com con tu dirección de correo electrónico):

sudo certbot --nginx -d tudominio.com -d www.tudominio.com --email tu_email@ejemplo.com

Explicación del comando:

  • sudo certbot: Ejecuta el cliente Certbot.
  • --nginx: Le dice a Certbot que use el plugin de Nginx para la configuración automática.
  • -d tudominio.com -d www.tudominio.com: Especifica los dominios para los cuales deseas obtener el certificado. Puedes añadir tantos -d como necesites para otros subdominios, como blog.tudominio.com.
  • --email tu_email@ejemplo.com: Proporciona tu dirección de correo electrónico. Let's Encrypt lo utiliza para notificaciones importantes (por ejemplo, recordatorios de renovación de certificados).

Durante la ejecución del comando, Certbot te hará algunas preguntas:

  1. Te pedirá que aceptes los Términos de Servicio de Let's Encrypt. Presiona A y luego Enter.
  2. Te preguntará si deseas compartir tu dirección de correo electrónico con la Electronic Frontier Foundation (EFF) para recibir noticias y actualizaciones. Puedes elegir Y o N.
  3. Te preguntará si deseas que Nginx redirija automáticamente el tráfico HTTP a HTTPS. Esto es altamente recomendado. Elige la opción que fuerza la redirección (generalmente 2: Redirect).

Si todo sale bien, verás un mensaje de éxito similar a este:

Successfully received certificate.
Successfully deployed certificate for tudominio.com to /etc/nginx/sites-available/tudominio.com
Successfully deployed certificate for www.tudominio.com to /etc/nginx/sites-available/tudominio.com
Congratulations! You have successfully enabled HTTPS on https://tudominio.com and https://www.tudominio.com
...

Certbot habrá modificado automáticamente tu archivo de configuración de Nginx (/etc/nginx/sites-available/tudominio.com) para incluir las directivas SSL y la redirección HTTP a HTTPS. También habrá recargado Nginx.

Puedes verificar la configuración de tu sitio Nginx nuevamente con sudo nginx -t.

🌐 Verificar la Instalación SSL

Ahora, abre tu navegador y visita https://tudominio.com (o https://www.tudominio.com). Deberías ver:

  • Un icono de candado en la barra de direcciones, indicando una conexión segura.
  • Si intentas acceder a http://tudominio.com, deberías ser redirigido automáticamente a la versión HTTPS.

Puedes usar herramientas en línea como SSL Labs' SSL Server Test para realizar un análisis profundo de la configuración de tu certificado SSL y la seguridad de tu servidor.


🔄 Paso 4: Automatizar la Renovación del Certificado

Los certificados de Let's Encrypt son válidos por 90 días. Esto se hace para fomentar la automatización y minimizar el impacto de certificados comprometidos. Afortunadamente, Certbot ya instala un cron job o systemd timer para renovar automáticamente tus certificados antes de que expiren.

Para verificar que el proceso de renovación automática está funcionando, puedes simular una renovación:

sudo certbot renew --dry-run

Si el comando se ejecuta sin errores, significa que la renovación automática está configurada correctamente. Verás un mensaje similar a:

Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator nginx, Installer nginx
Simulating renewal of an existing certificate for tudominio.com and www.tudominio.com
...
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/tudominio.com/fullchain.pem (success)
...

Certbot intentará renovar los certificados dos veces al día. Solo renovará los certificados que estén a menos de 30 días de caducar.

⚠️ Advertencia: Es crucial que el comando sudo certbot renew --dry-run se ejecute sin errores. Si hay problemas, tu certificado podría caducar, haciendo que tu sitio no sea accesible a través de HTTPS.

⚙️ Paso 5: Ajustes Adicionales de Seguridad en Nginx (Opcional pero Recomendado)

Para mejorar aún más la seguridad de tu servidor Nginx y la puntuación de SSL Labs, puedes añadir algunas cabeceras de seguridad y fortalecer la configuración SSL.

Configurar Cabeceras de Seguridad

Edita tu archivo de configuración de Nginx (/etc/nginx/sites-available/tudominio.com) o, preferiblemente, crea un archivo de configuración SSL separado que puedas incluir en tus server blocks para mantener la limpieza.

  1. Crea un archivo de configuración SSL:
sudo nano /etc/nginx/snippets/ssl-tudominio.com.conf
Añade el siguiente contenido para configuraciones SSL recomendadas:
ssl_session_cache shared:LE_SSL:10m;
ssl_session_timeout 1h;
ssl_session_tickets off;

# HSTS (Strict-Transport-Security) para asegurar que el navegador siempre use HTTPS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

# Mejorar la seguridad contra ataques de clickjacking
add_header X-Frame-Options SAMEORIGIN;

# Proteger contra ataques XSS
add_header X-XSS-Protection "1; mode=block";

# Evitar que el navegador intente adivinar el tipo MIME de los archivos
add_header X-Content-Type-Options nosniff;

# Cabecera Referrer-Policy para controlar la información de referencia
add_header Referrer-Policy "no-referrer-when-downgrade";

# Eliminar la versión de Nginx de los encabezados (seguridad por oscuridad)
server_tokens off;
<div class="callout important">🔥 <strong>Importante:</strong> La cabecera `Strict-Transport-Security` (HSTS) es muy potente. Asegúrate de que tu sitio funcione perfectamente con HTTPS antes de activarla con `includeSubDomains` y `preload`, ya que forzará el uso de HTTPS incluso para subdominios y en navegadores que la soporten, por un largo periodo.</div>

2. Actualiza el archivo de configuración de tu dominio para incluir este snippet:

Abre `sudo nano /etc/nginx/sites-available/tudominio.com` y busca la sección `server` que Certbot modificó para SSL. Añade la línea `include /etc/nginx/snippets/ssl-tudominio.com.conf;` dentro del bloque `server` que escucha en el puerto 443.

Tu archivo de configuración debería verse así (el orden puede variar ligeramente):
server {
listen 80;
listen [::]:80;
server_name tudominio.com www.tudominio.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name tudominio.com www.tudominio.com;

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

ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;

# Incluye las configuraciones SSL adicionales
include /etc/nginx/snippets/ssl-tudominio.com.conf;

# Configuración de cifrados y protocolos SSL (recomendado para A+ en SSL Labs)
ssl_protocols TLSv1.2 TLSv1.3; # Deshabilitar TLSv1.1 y anteriores
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem; # Se crea en el siguiente paso

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

Generar un Fuerte Grupo Diffie-Hellman (DH)

El intercambio de claves Diffie-Hellman (DH) ayuda a asegurar un "forward secrecy" perfecto. Generar un archivo DH param puede llevar un tiempo, pero es un paso importante para la seguridad.

sudo mkdir -p /etc/nginx/ssl
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
# Para mayor seguridad, puedes usar 4096 bits, pero tardará más:
# sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
  1. Guarda los cambios, prueba la configuración y reinicia Nginx:
sudo nginx -t
sudo systemctl restart nginx

Ahora tu servidor Nginx debería tener una configuración SSL mucho más robusta. Puedes volver a ejecutar el test de SSL Labs para ver tu nueva calificación.

Inicio Configurar Nginx (Puerto 80 / HTTP) Instalar Certbot Ejecutar Certbot para obtener certificado Let's Encrypt (Servidor ACME) Certbot modifica Nginx y reinicia el servicio Verificación SSL Fin Usuario Seguro Acceso HTTPS

Troubleshooting Común 🐛

  • Problema: "Waiting for verification..." o error de conexión.
    • Solución: Asegúrate de que los puertos 80 y 443 estén abiertos en tu firewall (ej. sudo ufw allow 'Nginx Full'). Verifica que el DNS de tu dominio apunte correctamente a la IP de tu servidor.
  • Problema: "The certificate is not due for renewal."
    • Solución: Este es un mensaje normal cuando intentas renovar un certificado que aún tiene mucho tiempo para expirar. Usa sudo certbot renew --dry-run para una prueba sin renovación real.
  • Problema: Nginx no se inicia después de la configuración SSL.
    • Solución: Ejecuta sudo nginx -t para ver errores de sintaxis en tu configuración. Revisa cuidadosamente los cambios que hizo Certbot o que hayas hecho manualmente en tus archivos .conf.
  • Problema: Mi sitio sigue mostrando "No seguro" o no redirige a HTTPS.
    • Solución: Asegúrate de que la redirección HTTP a HTTPS esté configurada en tu server block (generalmente return 301 https://$host$request_uri; en el bloque listen 80). Borra la caché de tu navegador o prueba en modo incógnito.
Preguntas Frecuentes (FAQ)

¿Puedo usar Let's Encrypt para múltiples dominios en el mismo servidor?

Sí, puedes especificar múltiples dominios con la opción -d en el comando certbot. Por ejemplo: sudo certbot --nginx -d dominio1.com -d www.dominio1.com -d dominio2.net -d www.dominio2.net.

¿Qué pasa si quiero revocar un certificado?

Puedes revocar un certificado usando el comando sudo certbot revoke --cert-name tudominio.com. Luego, deberías eliminar las configuraciones SSL de Nginx para ese dominio y reiniciar Nginx.

¿Qué es http2 en la configuración listen 443 ssl http2?

http2 habilita el protocolo HTTP/2, una versión más rápida y eficiente de HTTP. Es altamente recomendable usarlo junto con HTTPS.

¿Es Let's Encrypt realmente seguro?

Sí, Let's Encrypt sigue los mismos estándares de seguridad que otras autoridades de certificación. Los certificados son válidos y confiables para todos los navegadores modernos. La principal diferencia es que el proceso es automatizado y gratuito.

Conclusión ✨

Has llegado al final de esta guía completa para proteger tu servidor Nginx con certificados SSL/TLS gratuitos de Let's Encrypt. Al seguir estos pasos, no solo has implementado una capa crucial de seguridad para tu sitio web, sino que también has mejorado la confianza de tus usuarios y el posicionamiento en buscadores. La automatización de la renovación garantiza que tu sitio permanezca seguro sin intervención manual constante, lo que te permite concentrarte en el desarrollo de tu aplicación.

La seguridad web es un viaje continuo, y la configuración de HTTPS es un pilar fundamental. ¡Felicidades por dar este gran paso!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!

Asegura Nginx con Let's Encrypt: Guía Completa para HTTPS Gratuito y Automatizado | tutoriales.com