¿Qué es un Certificado SSL y por qué es necesario?
Un certificado SSL (Secure Sockets Layer) es un archivo digital que se instala en un
servidor para habilitar el cifrado HTTPS. Sirve para:
● Cifrar la comunicación entre los usuarios y el servidor.
● Proteger datos sensibles como contraseñas y tarjetas de crédito.
● Evitar ataques de intermediarios (MITM - Man in the Middle).
● Mejorar el SEO y la confianza de los usuarios.
¿Dónde se instala el certificado SSL?
El SSL debe instalarse en el servidor que maneja las conexiones HTTPS. Dependiendo del
servicio y la arquitectura, el certificado puede aplicarse en diferentes lugares:
1. Si usas un servidor web (Apache, Nginx, etc.)
○ Debes instalar el certificado directamente en el servidor web configurando los
archivos .crt y .key.
○ Se agregan reglas en la configuración del servidor para habilitar HTTPS.
2. Si usas un proxy inverso (ej. Nginx, Traefik, Caddy)
○ El proxy se encarga del tráfico HTTPS y “desencripta” las conexiones antes
de enviarlas a los servicios internos.
○ Aquí es donde normalmente se instala el SSL.
3. Si usas un servicio en la nube (ej. Cloudflare, AWS, Google Cloud, etc.)
○ Algunas plataformas ofrecen SSL a nivel de dominio o balanceador de carga.
○ En este caso, puedes dejar la conexión encriptada hasta el servidor o
terminarla en el proxy.
¿Es suficiente con que el dominio tenga SSL?
No siempre. Si usas un proveedor como Cloudflare que maneja SSL, pero la conexión de
Cloudflare a tu servidor es en HTTP, la comunicación interna sigue sin estar cifrada.
Idealmente, debes instalar un certificado en tu servidor si manejas datos sensibles o no
quieres depender de terceros.
¿Cómo afecta SSL si uso Docker?
Si usas Docker, tienes varias formas de manejar SSL:
1. SSL dentro del contenedor
○ Instalas el certificado dentro del contenedor (ej. en Apache o Nginx).
○ No es ideal porque cada vez que creas un nuevo contenedor, tendrías que
configurarlo nuevamente.
2. SSL en un proxy inverso externo (Recomendado)
○ Usas un proxy como Nginx, Traefik o Caddy fuera del contenedor.
○ El proxy maneja el tráfico HTTPS y reenvía las solicitudes a los contenedores
internos en HTTP.
○ Ventaja: Centralizas el manejo de SSL y facilitas la renovación automática
con Let’s Encrypt.
3. SSL en un balanceador de carga externo
○ Si usas servicios en la nube como AWS ELB o Cloudflare, puedes manejar
SSL allí y comunicarte en HTTP con tu backend.
○
Ejemplo con Docker y Nginx como proxy
Si tienes una aplicación en Docker y quieres usar Nginx como proxy con SSL, podrías hacer
algo así:
1. Descargar e instalar Certbot para obtener un certificado SSL
sudo apt install certbot sudo certbot certonly --standalone -d [Link]
2. Configurar Nginx con SSL (fuera del contenedor)
server { listen 443 ssl; server_name [Link]; ssl_certificate
/etc/letsencrypt/live/[Link]/[Link]; ssl_certificate_key
/etc/letsencrypt/live/[Link]/[Link]; location / { proxy_pass
[Link] # Redirige tráfico a tu contenedor proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
3. Docker Compose con la app y Nginx como proxy
version: '3'
services:
app:
image: mi-aplicacion
container_name: mi-app
ports:
- "5000:5000"
nginx:
image: nginx
container_name: proxy-nginx
volumes:
- ./[Link]:/etc/nginx/[Link]
- /etc/letsencrypt:/etc/letsencrypt
ports:
- "80:80"
- "443:443"
En este caso, Nginx gestiona HTTPS y reenvía las solicitudes a la aplicación en HTTP
dentro del contenedor.
Conclusión
● El SSL debe instalarse en el servidor que recibe las conexiones HTTPS.
● Si usas Docker, lo mejor es manejar SSL en un proxy inverso (Nginx, Traefik, Caddy)
en lugar de dentro de cada contenedor.
● Si usas servicios como Cloudflare o AWS, puedes manejar SSL ahí, pero aún así
deberías considerar cifrar la comunicación interna.