Cómo funcionan realmente HTTPS y TLS: Guía práctica
Has visto el icono del candado en tu navegador y sabes que HTTPS es importante. Pero, ¿realmente entiendes qué sucede cuando un navegador se conecta a un sitio HTTPS? Muchos desarrolladores tratan TLS como una caja negra: lo configuran una vez y lo olvidan. Eso funciona hasta que algo falla, el rendimiento se resiente o una auditoría de seguridad revela configuraciones incorrectas.
Esta guía explica HTTPS y TLS en términos prácticos. Aprenderás el proceso de handshake, cómo los certificados establecen confianza y los pasos para implementar TLS correctamente en tus servidores. Sin exceso de jerga, solo los conceptos que necesitas para depurar problemas y tomar decisiones informadas.
Qué es realmente HTTPS
HTTPS es HTTP sobre TLS (Transport Layer Security). Proporciona tres garantías:
- Cifrado: Los datos intercambiados entre cliente y servidor son ilegibles para los espías.
- Autenticación: El cliente verifica que está hablando con el servidor legítimo, no con un impostor.
- Integridad: Los datos no pueden modificarse en tránsito sin ser detectados.
TLS es el protocolo que hace esto posible. SSL es su predecesor; todavía verás "certificados SSL" en marketing, pero los sistemas modernos usan TLS (actualmente TLS 1.3 es el más reciente).
El handshake TLS: paso a paso
Antes de que fluya cualquier dato HTTP, el cliente y el servidor realizan un handshake para acordar parámetros de cifrado y verificar identidades. Este es el flujo simplificado para TLS 1.3, el estándar moderno:
- Client Hello: El navegador envía una lista de suites de cifrado compatibles, versiones de TLS y un valor aleatorio (client random).
- Server Hello: El servidor elige una suite de cifrado, envía su propio valor aleatorio (server random) y proporciona su cadena de certificados.
- Intercambio de claves: Usando Diffie-Hellman efímero (o similar), ambas partes derivan un secreto compartido sin transmitirlo directamente. Esto proporciona secreto hacia adelante (forward secrecy): comprometer la clave privada del servidor en el futuro no descifrará sesiones pasadas.
- Verificación del certificado: El cliente verifica el certificado contra las CA raíz de confianza, valida el nombre de dominio y comprueba la expiración y el estado de revocación.
- Finished: Ambos lados envían un MAC (código de autenticación de mensaje) para confirmar que el handshake no fue manipulado. Comienza el tráfico HTTP cifrado.
TLS 1.3 redujo el handshake a un solo viaje de ida y vuelta (1-RTT) y admite la reanudación 0-RTT para visitantes recurrentes, mejorando la latencia. TLS 1.2 requería dos viajes de ida y vuelta.
Certificados: el ancla de confianza
Un certificado TLS vincula una clave pública a un nombre de dominio y está firmado por una Autoridad de Certificación (CA). Cuando tu navegador se conecta a example.com, verifica que el certificado:
- Esté firmado por una CA en su almacén de confianza (o encadene hasta una).
- Coincida con el nombre de dominio (mediante Subject Alternative Names).
- Esté dentro de su período de validez.
- No haya sido revocado (mediante OCSP o CRL, aunque la aplicación varía).
Puedes obtener certificados gratuitos de Let's Encrypt, que emite certificados de 90 días mediante el protocolo ACME. Herramientas de automatización como Certbot gestionan la renovación. Para servicios internos, puedes ejecutar tu propia CA, pero los clientes deben confiar en ella explícitamente.
Configurar TLS en tu servidor
Una configuración adecuada equilibra seguridad, compatibilidad y rendimiento. Aquí tienes una lista de verificación:
- Usa solo TLS 1.2 y 1.3. Deshabilita TLS 1.0 y 1.1, están obsoletos y son vulnerables.
- Elige suites de cifrado fuertes. Prefiere cifrados AEAD como AES-GCM o ChaCha20-Poly1305. Evita el modo CBC y RC4.
- Habilita el secreto hacia adelante. Usa intercambio de claves ECDHE.
- Habilita el stapling OCSP. El servidor incluye una respuesta OCSP en caché, reduciendo la latencia del lado del cliente y las fugas de privacidad.
- Establece cabeceras HSTS. Fuerza a los navegadores a usar HTTPS en visitas futuras.
- Redirige HTTP a HTTPS. Asegúrate de que no se sirva tráfico en texto plano.
Para Nginx, una configuración segura mínima se ve así:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://localhost:3000;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
Prueba tu configuración con herramientas como SSL Labs' SSL Test o testssl.sh. Apunta a una calificación A, pero no persigas puntuaciones perfectas a costa de romper clientes antiguos si debes soportarlos.
Errores comunes y cómo evitarlos
- Certificados caducados: Automatiza la renovación y monitoriza la expiración. Un solo certificado caducado puede tumbar tu sitio.
- Contenido mixto: Cargar recursos HTTP en una página HTTPS genera advertencias y rompe funcionalidades. Usa URLs relativas o HTTPS en todas partes.
- Protocolos débiles: TLS 1.0/1.1 están obsoletos. Actualiza tu configuración.
- Certificados intermedios faltantes: El servidor debe enviar la cadena completa (excepto la raíz). La falta de intermedios causa errores de confianza en algunos clientes.
- Redirecciones incorrectas: Redirige HTTP a HTTPS antes de servir cualquier contenido y usa 301 para redirecciones permanentes.
Preguntas frecuentes
¿Cuál es la diferencia entre HTTPS y TLS?
HTTPS es HTTP sobre TLS. TLS es el protocolo criptográfico que proporciona cifrado, autenticación e integridad. No puedes tener HTTPS sin TLS.
¿Necesito un certificado separado para www y sin www?
Puedes incluir ambos en el campo Subject Alternative Names (SAN) de un único certificado. La mayoría de las CA emiten certificados que cubren ambos por defecto o con una configuración simple.
¿Con qué frecuencia debo rotar mis certificados TLS?
Sigue el período de validez de la CA: 90 días para Let's Encrypt. Automatiza la renovación con un cron job o un timer de systemd. Rota inmediatamente si una clave privada se ve comprometida.
¿Listo para inspeccionar tu tráfico web? Usa el Analizador de Logs de Nginx para parsear los logs de acceso y verificar solicitudes HTTPS, códigos de estado y posibles problemas.