Cómo Configurar un Certificado SSL en Nginx: Una Guía Completa Paso a Paso
Asegurar tu sitio web con un certificado SSL/TLS ya no es opcional — es un requisito fundamental para la confianza del usuario, la protección de datos y el posicionamiento en motores de búsqueda. Google ha utilizado explícitamente HTTPS como señal de clasificación desde 2014, y los navegadores modernos advierten activamente a los visitantes cuando un sitio carece de cifrado. Si estás ejecutando Nginx como servidor web, esta guía te explicará todo lo que necesitas saber para instalar, configurar y automatizar la gestión de certificados SSL usando Certbot y Let’s Encrypt.
Ya sea que estés administrando un entorno de VPS Hosting, un servidor dedicado o un plan de alojamiento compartido, un SSL correctamente configurado es innegociable para cualquier sitio web en producción.
¿Qué es un certificado SSL y por qué lo necesita Nginx?
Un certificado SSL (Secure Sockets Layer) — denominado hoy con mayor precisión como certificado TLS (Transport Layer Security) — establece una conexión cifrada entre tu servidor web y el navegador del visitante. Este cifrado garantiza que los datos sensibles, como credenciales de inicio de sesión, información de pago y datos personales, no puedan ser interceptados por terceros malintencionados.
Para Nginx específicamente, la configuración SSL implica:
- Archivos de certificado: La cadena de certificados públicos emitida por una Autoridad de Certificación (CA)
- Clave privada: Una clave generada criptográficamente almacenada de forma segura en tu servidor
- Directivas del bloque de servidor: Instrucciones de configuración de Nginx que vinculan el certificado a tu dominio
Sin SSL, tu sitio se sirve a través de HTTP, lo que significa que todo el tráfico se transmite en texto plano. Con SSL correctamente configurado, tu sitio utiliza HTTPS — cifrado, autenticado y de confianza para navegadores y motores de búsqueda por igual.
> Consejo profesional: Si estás evaluando opciones de alojamiento, AlexHost ofrece Certificados SSL para dominios de todo tipo, incluyendo certificados de Validación de Dominio (DV), Validación de Organización (OV) y Validación Extendida (EV).
Requisitos previos antes de comenzar
Antes de profundizar en los pasos de configuración, asegúrate de que se cumplan las siguientes condiciones:
- Un servidor web Nginx en funcionamiento en un sistema basado en Linux (se recomienda Ubuntu 20.04/22.04 o Debian)
- Acceso root o sudo a tu servidor
- Un nombre de dominio registrado que apunte a la dirección IP de tu servidor mediante registros DNS A — puedes registrar uno a través de Registro de Dominios
- Puertos del firewall abiertos: Los puertos TCP 80 (HTTP) y 443 (HTTPS) deben ser accesibles
- Un usuario no root con privilegios sudo (mejor práctica para la seguridad del servidor)
Puedes verificar que Nginx está en funcionamiento con:
sudo systemctl status nginxY confirmar que tu dominio se resuelve correctamente usando:
dig yourdomain.com +shortPaso 1: Instalar Certbot en tu servidor
Certbot es el cliente oficial de código abierto para Let’s Encrypt — una Autoridad de Certificación gratuita, automatizada y ampliamente confiable. Gestiona todo el proceso de emisión de certificados, incluyendo la validación del dominio y las actualizaciones de configuración de Nginx.
Actualiza tu índice de paquetes
Comienza siempre actualizando tus listas de paquetes para asegurarte de instalar las últimas versiones disponibles:
sudo apt update && sudo apt upgrade -yInstala Certbot y el plugin de Nginx
El plugin python3-certbot-nginx permite a Certbot leer y modificar directamente tus archivos de configuración de Nginx, automatizando gran parte del proceso de configuración:
sudo apt install certbot python3-certbot-nginx -yVerifica la instalación
Confirma que Certbot se instaló correctamente comprobando su versión:
certbot --versionDeberías ver una salida similar a certbot 2.x.x.
Paso 2: Permitir el tráfico HTTPS a través de tu firewall
Si estás usando UFW (Uncomplicated Firewall), necesitas permitir explícitamente el tráfico HTTPS antes de continuar:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
sudo ufw statusEl perfil Nginx Full permite tanto HTTP (puerto 80) como HTTPS (puerto 443). Eliminar la regla HTTP independiente garantiza que, una vez configurado SSL, no dejes puertos innecesarios abiertos sin propósito.
Paso 3: Obtener tu certificado SSL de Let’s Encrypt
Con Certbot instalado y tu firewall configurado, ahora puedes solicitar un certificado. El indicador --nginx le indica a Certbot que use el plugin de Nginx, que gestiona automáticamente la verificación del desafío ACME y actualiza la configuración de tu servidor.
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com¿Qué ocurre durante este proceso?
- Verificación de propiedad del dominio: Certbot modifica temporalmente tu configuración de Nginx para servir un archivo de desafío, demostrando a Let’s Encrypt que controlas el dominio
- Emisión del certificado: Let’s Encrypt emite un certificado firmado válido por 90 días
- Configuración automática de Nginx: Certbot actualiza tu bloque de servidor de Nginx para usar los nuevos archivos de certificado
Indicaciones interactivas
Durante el proceso, Certbot solicitará:
- Una dirección de correo electrónico para avisos urgentes de renovación y seguridad
- Aceptación de los Términos de Servicio
- Si redirigir HTTP a HTTPS — elige siempre la opción 2 (Redirigir) para aplicar HTTPS en todo el sitio
Tus certificados se almacenarán en:
/etc/letsencrypt/live/yourdomain.com/Los archivos clave son:
| Archivo | Propósito |
|---|---|
fullchain.pem | Tu certificado + cadena intermedia |
privkey.pem | Tu clave privada (mantenla en secreto) |
cert.pem | Solo tu certificado de dominio |
chain.pem | Solo certificados intermedios |
Paso 4: Configurar Nginx manualmente para SSL (Avanzado)
Aunque Certbot automatiza la mayor parte de la configuración, entender la configuración manual te da control total sobre tu implementación SSL — esencial para el ajuste de rendimiento, el endurecimiento de seguridad y las implementaciones personalizadas.
Abre la configuración del bloque de servidor de Nginx
sudo nano /etc/nginx/sites-available/yourdomain.comSi estás usando el archivo de configuración predeterminado:
sudo nano /etc/nginx/sites-available/defaultConfiguración completa del bloque de servidor SSL
Reemplaza o actualiza tu configuración con el siguiente ejemplo reforzado:
# Redirect all HTTP traffic to HTTPS
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
# HTTPS server block
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
# SSL Certificate Paths
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# Recommended SSL parameters
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Security Headers
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "no-referrer-when-downgrade";
# Document root and index
root /var/www/yourdomain.com/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}Explicación de las directivas de configuración clave
ssl_protocols TLSv1.2 TLSv1.3: Deshabilita protocolos más antiguos y vulnerables (SSLv3, TLS 1.0, TLS 1.1)ssl_ciphers: Especifica un conjunto de cifrados sólido que prioriza el secreto hacia adelantessl_stapling on: Habilita el grapado OCSP, reduciendo la latencia del protocolo de enlace SSLStrict-Transport-Security: Indica a los navegadores que siempre usen HTTPS para tu dominio (HSTS)http2: Habilita HTTP/2 para mejorar el rendimiento en conexiones HTTPS
Paso 5: Probar tu configuración de Nginx
Antes de reiniciar Nginx, valida siempre la sintaxis de tu configuración para detectar errores que podrían dejar tu sitio fuera de línea:
sudo nginx -tUna prueba exitosa devuelve:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulSi encuentras errores, revisa la salida cuidadosamente — Nginx indicará el archivo y el número de línea donde existe el problema.
Paso 6: Reiniciar Nginx para aplicar los cambios
Una vez que la prueba de configuración sea exitosa, recarga o reinicia Nginx:
# Graceful reload (preferred for production — no downtime)
sudo systemctl reload nginx
# Full restart (use if reload doesn't apply all changes)
sudo systemctl restart nginxVerifica que Nginx funciona correctamente después del reinicio:
sudo systemctl status nginxPaso 7: Configurar la renovación automática del certificado SSL
Los certificados de Let’s Encrypt caducan después de 90 días. Este corto período de validez es intencional — limita el daño causado por certificados comprometidos y fomenta la automatización. Certbot instala automáticamente un temporizador systemd (o tarea cron) para gestionar las renovaciones, pero debes verificarlo y probarlo.
Comprueba el temporizador de renovación existente
sudo systemctl status certbot.timerDeberías ver que el temporizador está activo y programado para ejecutarse dos veces al día.
Prueba el proceso de renovación
Simula una renovación sin modificar realmente ningún certificado:
sudo certbot renew --dry-runLa salida exitosa incluirá:
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/yourdomain.com/fullchain.pem (success)Añade un hook posterior a la renovación para recargar Nginx
Certbot no recargará automáticamente Nginx después de renovar los certificados a menos que configures un hook de despliegue. Crea uno con:
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.shAñade el siguiente contenido:
#!/bin/bash
systemctl reload nginxHazlo ejecutable:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.shEsto garantiza que Nginx cargue los archivos de certificado actualizados inmediatamente después de cada renovación exitosa.
Paso 8: Verificar tu instalación SSL
Después de completar la configuración, verifica tu configuración SSL usando estos métodos:
Comprobación en el navegador
Navega a https://yourdomain.com en tu navegador. Deberías ver un icono de candado en la barra de direcciones que indica una conexión segura.
Herramientas de prueba SSL en línea
Usa estas herramientas gratuitas para auditar la calidad de tu configuración SSL:
- SSL Labs (Qualys):
https://www.ssllabs.com/ssltest/— Proporciona una calificación por letras (apunta a A o A+) - Security Headers:
https://securityheaders.com/— Audita tus cabeceras de seguridad HTTP - HSTS Preload:
https://hstspreload.org/— Comprueba la elegibilidad para la precarga HSTS
Verificación por línea de comandos
# Check certificate details
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
# Check certificate expiry date
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -datesSolución de problemas comunes de SSL en Nginx
| Problema | Causa probable | Solución |
|---|---|---|
ERR_SSL_PROTOCOL_ERROR | Nginx no escucha en el puerto 443 | Comprueba la directiva listen 443 ssl; y las reglas del firewall |
NET::ERR_CERT_AUTHORITY_INVALID | Usando cert.pem en lugar de fullchain.pem | Actualiza ssl_certificate para usar fullchain.pem |
| El certificado no se renueva | Temporizador de Certbot deshabilitado o puerto 80 bloqueado | Ejecuta sudo certbot renew --dry-run y comprueba los registros |
| Advertencias de contenido mixto | Recursos HTTP cargados en una página HTTPS | Actualiza todos los enlaces internos y URLs de recursos a HTTPS |
SSL_ERROR_RX_RECORD_TOO_LONG | Tráfico HTTP llegando al puerto HTTPS | Asegúrate de que la redirección del puerto 80 al 443 esté configurada |
Elegir el entorno de alojamiento adecuado para SSL
El rendimiento y la fiabilidad de tu implementación SSL dependen en gran medida de tu entorno de alojamiento. Aquí tienes una descripción general rápida:
- VPS Hosting: El acceso root completo te da control total sobre la configuración de Nginx, los parámetros SSL y la gestión de certificados — ideal para esta guía
- Servidores Dedicados: Máximo rendimiento y aislamiento para sitios de alto tráfico que requieren configuraciones SSL de nivel empresarial
- Alojamiento Web Compartido: SSL se gestiona normalmente a través de un panel de control; la configuración manual de Certbot puede no estar disponible
- VPS con cPanel: Simplifica la gestión de SSL a través de una interfaz gráfica manteniendo el control a nivel de VPS
Para desarrolladores y administradores de sistemas que necesitan control total sobre su stack SSL, un VPS o servidor dedicado es la opción recomendada.
Conclusión
Configurar SSL en Nginx es un proceso de varios pasos, pero cada paso cumple un propósito crítico — desde cifrar el tráfico y verificar la propiedad del dominio hasta reforzar la configuración de cifrado y automatizar las renovaciones. Siguiendo esta guía, has implementado:
✅ Un certificado SSL gratuito y de confianza a través de Let’s Encrypt y Certbot
✅ Una configuración SSL de Nginx reforzada con protocolos TLS modernos
✅ Redirección de HTTP a HTTPS para todo el tráfico
✅ Grapado OCSP para mejorar el rendimiento del protocolo de enlace
✅ HSTS y cabeceras de seguridad para una defensa en profundidad
✅ Renovación automatizada de certificados con hooks de recarga de Nginx
Un certificado SSL correctamente configurado no solo protege a tus usuarios — genera confianza, mejora tu posicionamiento SEO y es un requisito básico para cualquier presencia web profesional. Si buscas una infraestructura fiable para alojar tu servidor Nginx con SSL, explora los planes de VPS Hosting de AlexHost, diseñados específicamente para desarrolladores y empresas que se toman la seguridad en serio.
