Cómo funcionan HTTPS y TLS: Guía práctica
Probablemente hayas visto el icono del candado en tu navegador y sepas que significa "seguro". Pero, ¿qué ocurre realmente cuando un usuario escribe https:// antes de tu dominio? Si eres desarrollador, entender la mecánica de HTTPS y TLS no es solo algo académico: te ayuda a depurar problemas de conexión, elegir el certificado adecuado y evitar errores de seguridad sutiles.
Esta guía desglosa el handshake TLS, la validación de certificados y el cifrado en un lenguaje sencillo, con ejemplos prácticos que puedes aplicar a tus propios proyectos.
Qué es realmente HTTPS
HTTPS es simplemente HTTP sobre TLS (Transport Layer Security). TLS proporciona tres garantías:
- Cifrado: Los datos intercambiados entre cliente y servidor son ilegibles para los espías.
- Autenticación: El servidor demuestra su identidad mediante un certificado firmado por una autoridad de confianza.
- Integridad: Los mensajes no pueden modificarse en tránsito sin ser detectados.
Sin TLS, HTTP envía todo en texto plano: contraseñas, cookies y datos personales son visibles para cualquiera en la ruta de red.
El handshake TLS en lenguaje sencillo
Antes de enviar cualquier dato HTTP, el cliente y el servidor realizan un handshake para acordar los parámetros de cifrado. TLS 1.3 (el estándar moderno) simplifica esto a un solo viaje de ida y vuelta.
Paso a paso: handshake TLS 1.3
- Client Hello: El cliente envía una lista de suites de cifrado compatibles, versiones de TLS y un key share (una clave pública para el intercambio de claves).
- Server Hello: El servidor elige una suite de cifrado, envía su propio key share y proporciona su cadena de certificados.
- Derivación de claves: Ambos lados calculan de forma independiente el mismo secreto compartido mediante el intercambio de claves Diffie-Hellman. Este secreto nunca se envía por la red.
- Finished: El cliente y el servidor intercambian mensajes "Finished" cifrados para confirmar que el handshake se realizó correctamente.
Tras estos pasos, los datos de la aplicación (peticiones y respuestas HTTP) se cifran con claves simétricas derivadas del secreto compartido.
Aquí tienes una ilustración simplificada del flujo del handshake:
Cliente Servidor
| |
|-------- ClientHello (key share) ---->|
| |
|<------- ServerHello (key share, -----|
| certificado, Finished) |
| |
|-------- Finished ------------------->|
| |
|<====== Datos HTTP cifrados =========>|
En TLS 1.2, el handshake requiere dos viajes de ida y vuelta e incluye un paso separado de intercambio de claves. TLS 1.3 reduce la latencia y elimina los algoritmos más débiles.
Cómo los certificados generan 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 un servidor, comprueba:
- Cadena de firmas: El certificado debe encadenarse hasta una CA raíz de confianza en el almacén de confianza del navegador.
- Coincidencia de dominio: El Subject Alternative Name (SAN) del certificado debe incluir el nombre de host solicitado.
- Periodo de validez: El certificado no debe estar caducado ni ser aún no válido.
- Estado de revocación: El navegador puede consultar OCSP o CRL para asegurarse de que el certificado no ha sido revocado.
Si alguna comprobación falla, el navegador muestra una advertencia. Let's Encrypt popularizó los certificados gratuitos y automatizados, haciendo HTTPS accesible para todos.
Tipos de certificados de un vistazo
| Tipo | Nivel de validación | Caso de uso típico |
|---|---|---|
| Domain Validated (DV) | Solo control del dominio | Sitios personales, blogs, APIs |
| Organization Validated (OV) | Dominio + identidad de la organización | Sitios web empresariales |
| Extended Validation (EV) | Verificación estricta de identidad | Instituciones financieras, sitios de alta confianza |
Para la mayoría de los desarrolladores, un certificado DV de Let's Encrypt es suficiente y puede renovarse automáticamente con herramientas como Certbot.
Cifrado: simétrico y asimétrico
TLS utiliza ambos tipos de cifrado:
- Criptografía asimétrica (de clave pública): Se usa durante el handshake para autenticar el servidor e intercambiar de forma segura un secreto compartido. Los algoritmos incluyen RSA y ECDHE.
- Cifrado simétrico: Se usa para el cifrado masivo de datos después del handshake. Los algoritmos incluyen AES-GCM y ChaCha20-Poly1305.
El cifrado simétrico es mucho más rápido, por eso se usa para la transferencia real de datos. La tarea del handshake es establecer esa clave simétrica de forma segura.
Errores comunes y cómo evitarlos
1. Contenido mixto
Si tu página HTTPS carga recursos (imágenes, scripts, estilos) por HTTP, los navegadores pueden bloquearlos o mostrar advertencias. Usa siempre URLs relativas o URLs explícitamente HTTPS.
2. Suites de cifrado débiles
Desactiva los protocolos obsoletos (TLS 1.0, TLS 1.1) y los cifrados débiles (RC4, 3DES). Los servidores modernos solo deberían admitir TLS 1.2 y 1.3 con suites de cifrado con secreto directo (forward secrecy).
3. Caducidad del certificado
Los certificados caducados provocan errores inmediatos en el navegador. Automatiza la renovación con Let's Encrypt y configura monitorización para avisarte antes de la caducidad.
4. Configuración incorrecta de la cadena
Los servidores deben enviar la cadena de certificados completa (excepto la raíz). La falta de certificados intermedios provoca fallos en algunos clientes. Usa herramientas como SSL Labs para probar tu cadena.
5. Configuración incorrecta de HSTS
HTTP Strict Transport Security (HSTS) obliga a los navegadores a usar HTTPS, pero una vez configurado es difícil de deshacer. Empieza con un max-age corto y auméntalo gradualmente.
Depurar problemas de TLS
Cuando HTTPS falla, estos comandos ayudan a diagnosticar el problema:
# Comprobar detalles del certificado y la cadena
openssl s_client -connect example.com:443 -servername example.com
# Probar versiones de TLS y cifrados
nmap --script ssl-enum-ciphers -p 443 example.com
# Verificar la expiración del certificado
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
Herramientas en línea como SSL Labs proporcionan una calificación completa y comentarios sobre la configuración.
Preguntas frecuentes
¿Cuál es la diferencia entre TLS y SSL?
SSL (Secure Sockets Layer) es el predecesor obsoleto de TLS. Los sistemas modernos usan TLS 1.2 o 1.3; "SSL" se usa a menudo coloquialmente, pero los protocolos no son lo mismo.
¿HTTPS ralentiza mi sitio web?
El TLS moderno añade una latencia mínima, a menudo solo unos pocos milisegundos con TLS 1.3 y la reanudación de sesión. Los beneficios de seguridad superan con creces la pequeña sobrecarga.
¿Con qué frecuencia debo renovar mi certificado TLS?
La mayoría de los certificados son válidos por 90 días (Let's Encrypt) o hasta un año. Automatiza la renovación y configura monitorización para evitar caducidades inesperadas.
¿Listo para inspeccionar tus propios certificados? Usa el Analizador de logs de Nginx para detectar errores de handshake TLS y monitorizar patrones de tráfico HTTPS en los logs de tu servidor.