Cómo funcionan realmente HTTPS y TLS: Guía práctica
Escribes https:// en tu navegador y ves un candado, pero ¿qué ocurre realmente entre bastidores? Muchos desarrolladores tratan HTTPS como una casilla de verificación: actívalo y olvídate. Sin embargo, comprender cómo funcionan realmente HTTPS y TLS es crucial para depurar problemas de conexión, optimizar el rendimiento y construir aplicaciones seguras. Esta guía recorre el handshake de TLS, la validación de certificados y las capas de cifrado con ejemplos prácticos, para que puedas responder con confianza a preguntas como "¿Por qué mi sitio es lento?" o "¿Qué significa ese error de certificado?".
Qué es realmente HTTPS
HTTPS es simplemente HTTP sobre TLS (Transport Layer Security). TLS proporciona tres garantías:
- Confidencialidad: Los datos se cifran para que los espías no puedan leerlos.
- Integridad: Los datos no pueden modificarse en tránsito sin ser detectados.
- Autenticación: Estás hablando con el servidor real, no con un impostor.
Sin TLS, HTTP envía todo en texto plano: contraseñas, cookies y datos personales son visibles para cualquiera en la red. TLS envuelve los mensajes HTTP en un túnel cifrado, haciéndolos ilegibles para terceros.
El handshake de TLS: paso a paso
Antes de que fluyan los datos HTTP, el cliente y el servidor realizan un handshake para acordar los parámetros de cifrado y verificar identidades. Esto es lo que sucede en un handshake típico de TLS 1.2 (TLS 1.3 lo simplifica, como veremos más adelante):
- Client Hello: El cliente envía una lista de suites de cifrado compatibles, versiones de TLS y un valor aleatorio.
- Server Hello: El servidor elige una suite de cifrado y versión de TLS, y envía su propio valor aleatorio.
- Certificado: El servidor envía su certificado TLS (y cualquier certificado intermedio) para demostrar su identidad.
- Intercambio de claves: Usando la clave pública del certificado, el cliente cifra un secreto pre-maestro y lo envía al servidor. Ambos lados derivan las mismas claves de sesión.
- Finished: Ambos lados envían un MAC sobre el handshake para verificar la integridad, y comienza la comunicación cifrada.
En TLS 1.3, el handshake se simplifica: el cliente envía una clave compartida en el primer mensaje, y el servidor responde con su propia clave compartida y certificado, reduciendo los viajes de ida y vuelta a solo uno. Esto acelera significativamente el establecimiento de la conexión.
Certificados y cadenas 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). Los navegadores confían en un conjunto de CA raíz preinstaladas en el sistema operativo o navegador. Cuando un servidor presenta su certificado, el navegador verifica:
- El certificado está firmado por una CA de confianza (directamente o mediante un intermedio).
- El nombre de dominio coincide con el que estás visitando.
- El certificado está dentro de su período de validez.
- El certificado no ha sido revocado (mediante OCSP o CRL).
Si alguna comprobación falla, verás una advertencia. Herramientas modernas como Let's Encrypt facilitan la obtención de certificados gratuitos y automatizados, así que no hay excusa para no usar HTTPS.
Cifrado simétrico vs. asimétrico en TLS
TLS combina hábilmente ambos tipos de cifrado:
- Cifrado asimétrico (de clave pública) se utiliza durante el handshake para intercambiar de forma segura un secreto compartido. Es computacionalmente costoso pero resuelve el problema de distribución de claves.
- Cifrado simétrico (por ejemplo, AES) utiliza ese secreto compartido para cifrar los datos reales. Es rápido y eficiente para grandes volúmenes de datos.
Este enfoque híbrido te proporciona la seguridad de la criptografía de clave pública con el rendimiento de los cifrados simétricos.
Ejemplo práctico: inspeccionar una conexión TLS
Puedes usar openssl para ver el handshake en acción. Ejecuta esto en tu terminal:
openssl s_client -connect example.com:443 -tls1_3
La salida muestra la suite de cifrado, la cadena de certificados y los detalles de la sesión. Busca líneas como Protocol : TLSv1.3 y Cipher : TLS_AES_256_GCM_SHA384. Esto es invaluable para depurar por qué un cliente no puede conectarse; tal vez no admite la suite de cifrado o la versión de TLS del servidor.
Errores comunes de TLS y cómo evitarlos
- Certificados caducados: Configura monitoreo y renovación automática (por ejemplo, con Certbot).
- Contenido mixto: Cargar recursos HTTP en una página HTTPS rompe el candado. Usa URLs relativas o HTTPS en todas partes.
- Suites de cifrado débiles: Deshabilita protocolos obsoletos (SSLv3, TLS 1.0/1.1) y cifrados débiles (RC4, 3DES). Usa herramientas como SSL Labs para probar tu configuración.
- Certificados intermedios faltantes: Algunos clientes requieren la cadena completa. Incluye siempre los intermedios en la configuración de tu servidor.
Para una comprobación rápida, ejecuta tu sitio a través de un probador de TLS en línea o usa openssl s_client -connect yourdomain.com:443 -showcerts para inspeccionar la cadena.
TLS 1.3: novedades y por qué es importante
TLS 1.3 (RFC 8446) trae mejoras importantes:
- Handshake más rápido: 1-RTT (o 0-RTT para sesiones reanudadas) reduce la latencia.
- Mayor seguridad: Elimina algoritmos heredados y exige secreto hacia adelante.
- Configuración simplificada: Menos suites de cifrado entre las que elegir.
La mayoría de los navegadores y servidores modernos admiten TLS 1.3. Habilitarlo puede mejorar el rendimiento y la seguridad simultáneamente.
Preguntas frecuentes
¿Cuál es la diferencia entre TLS y SSL?
SSL (Secure Sockets Layer) es el predecesor de TLS. Las versiones SSL 2.0 y 3.0 están obsoletas debido a fallos de seguridad. TLS es el protocolo moderno y seguro, aunque la gente todavía dice coloquialmente "certificado SSL".
¿Cómo afecta HTTPS al SEO y al rendimiento?
Los motores de búsqueda como Google usan HTTPS como señal de posicionamiento. En cuanto al rendimiento, TLS añade una pequeña sobrecarga durante el handshake, pero con TLS 1.3 y la reanudación de sesiones, el impacto es mínimo. Usar HTTP/2 o HTTP/3 (que requieren HTTPS) puede mejorar la velocidad.
¿Puedo usar HTTPS sin un certificado?
No. Se requiere un certificado para demostrar la identidad del servidor y habilitar el cifrado. Puedes obtener certificados gratuitos de Let's Encrypt o usar certificados autofirmados para pruebas internas, pero los navegadores advertirán a los usuarios sobre los certificados autofirmados.
¿Listo para probar tu configuración HTTPS? Usa nuestro Analizador de registros de Nginx para monitorear errores de handshake TLS y optimizar la configuración de tu servidor.