Cómo funcionan realmente HTTPS y TLS: handshake y certificados
Por qué HTTPS es importante (y por qué se malinterpreta)
Probablemente hayas visto el icono del candado en tu navegador y hayas asumido que el sitio es "seguro". Pero, ¿qué significa eso realmente? HTTPS no se trata solo de cifrado; se trata de identidad, integridad y confianza. Muchos desarrolladores tratan TLS como una caja negra: lo configuran una vez y lo olvidan. Eso lleva a configuraciones incorrectas, certificados caducados y suites de cifrado vulnerables.
En este artículo, desglosaremos cómo funcionan realmente HTTPS y TLS, desde el handshake hasta la validación de certificados, y te mostraremos cómo configurarlo correctamente. Sin rodeos, solo conocimiento práctico que puedes aplicar hoy.
El handshake TLS: qué sucede antes del primer byte
Cuando un cliente (navegador) se conecta a un servidor a través de HTTPS, realizan un handshake TLS. Esto establece un canal seguro. Aquí tienes una versión simplificada (TLS 1.3):
- Client Hello: El cliente envía las suites de cifrado compatibles, un valor aleatorio y una clave compartida (para el intercambio de claves).
- Server Hello: El servidor elige una suite de cifrado, envía su propio valor aleatorio y clave compartida, y presenta su cadena de certificados.
- Autenticación: El cliente verifica el certificado del servidor contra las CA de confianza y comprueba el nombre de host.
- Derivación de claves: Ambas partes calculan el secreto compartido usando ECDHE (Diffie-Hellman efímero de curva elíptica).
- Finished: Ambos envían mensajes "Finished" cifrados para confirmar el handshake.
Después de esto, los datos de la aplicación se cifran con claves simétricas. TLS 1.3 reduce los viajes de ida y vuelta a uno, mejorando la latencia.
Intercambio de claves: ECDHE vs RSA
Las versiones anteriores de TLS usaban intercambio de claves RSA, que carece de secreto directo (forward secrecy). Si la clave privada del servidor se ve comprometida, el tráfico pasado puede descifrarse. Las configuraciones modernas usan ECDHE, que proporciona secreto directo: cada sesión tiene claves únicas.
# Ejemplo: Verificar algoritmos de intercambio de claves compatibles
openssl s_client -connect example.com:443 -cipher 'ECDHE'
Certificados: los anclajes de confianza
Un certificado vincula una clave pública a una identidad (nombre de dominio). Está firmado por una Autoridad de Certificación (CA) en la que el cliente confía. Los navegadores incluyen un almacén de CA raíz de confianza.
Cuando visitas un sitio, el servidor envía una cadena: certificado de hoja (para tu dominio) → CA intermedia → CA raíz. El cliente verifica cada firma hasta una raíz de confianza.
Tipos de certificados
- Validación de dominio (DV): Solo prueba el control del dominio. Rápido y gratuito (por ejemplo, Let's Encrypt).
- Validación de organización (OV): Incluye detalles verificados de la organización.
- Validación extendida (EV): Verificación más estricta; los navegadores ya no muestran una barra verde, pero algunas empresas aún los usan.
Pasos de validación de certificados
Los navegadores comprueban:
- La cadena de firmas conduce a una raíz de confianza.
- El certificado está dentro de su período de validez.
- El nombre de host coincide (Nombres Alternativos del Sujeto).
- El certificado no está revocado (mediante OCSP o CRL).
Si alguna comprobación falla, recibes una advertencia. Nunca omitas estas advertencias en producción.
Configurar HTTPS en tu servidor
Veamos una configuración típica de Nginx para HTTPS con ajustes TLS modernos.
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-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# HSTS (usar con precaución)
add_header Strict-Transport-Security "max-age=63072000" always;
}
Notas:
- Usa solo TLS 1.2 y 1.3; deshabilita versiones anteriores.
- Prefiere cifrados ECDHE para secreto directo.
- Habilita HTTP/2 para mejorar el rendimiento.
- HSTS obliga a los navegadores a usar HTTPS; solo habilítalo después de probar.
Obtener certificados con Let's Encrypt
Let's Encrypt proporciona certificados DV gratuitos. Usa Certbot para automatizar la emisión y renovación:
sudo certbot --nginx -d example.com -d www.example.com
Certbot modifica tu configuración de Nginx y configura una tarea cron para la renovación. Siempre prueba la renovación con --dry-run.
Errores comunes y cómo evitarlos
- Certificados caducados: Configura monitoreo y renovación automática.
- Cadena incompleta: Incluye certificados intermedios (fullchain.pem).
- Cifrados débiles: Deshabilita RC4, DES y cifrados de exportación.
- Contenido mixto: Asegúrate de que todos los recursos (imágenes, scripts) se carguen a través de HTTPS.
- Sin HSTS: Sin HSTS, los usuarios pueden ser degradados a HTTP.
Probar tu configuración HTTPS
Usa herramientas en línea como SSL Labs o herramientas de línea de comandos para verificar tu configuración.
# Verificar detalles del certificado
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -text
# Probar compatibilidad con TLS 1.3
openssl s_client -connect example.com:443 -tls1_3
Busca:
- Cadena de certificados válida.
- Sin protocolos débiles (SSLv3, TLS 1.0, TLS 1.1).
- Secreto directo habilitado.
- Encabezado HSTS presente.
Preguntas frecuentes
¿Cuál es la diferencia entre TLS y SSL?
SSL es el predecesor de TLS. TLS 1.0 era esencialmente SSL 3.1. Hoy en día, "SSL" se usa a menudo coloquialmente, pero siempre debes usar TLS 1.2 o 1.3.
¿Necesito un certificado de pago para HTTPS?
No. Los certificados DV gratuitos de Let's Encrypt son confiables para todos los navegadores principales y proporcionan el mismo cifrado que los de pago. Los certificados de pago ofrecen garantías y soporte, pero el cifrado es idéntico.
¿Cómo afecta HTTPS al rendimiento?
TLS agrega latencia debido al handshake, pero TLS 1.3 lo reduce a un viaje de ida y vuelta. Con la reanudación de sesión y HTTP/2, la sobrecarga es mínima. Los costos de cifrado/descifrado son bajos en las CPU modernas.
¿Listo para inspeccionar la configuración TLS de tu servidor? Usa nuestro Analizador de registros de Nginx para detectar patrones de tráfico inusuales y asegurarte de que tu configuración HTTPS funcione como se espera.