Parte 1 de la serie "Seguridad web en la UE: 10 pasos para una mejor calificación"
El problema en 30 segundos
Tu sitio web tiene un certificado TLS. Bien. Pero cuando un usuario escribe http://tu-dominio.com — ¿qué ocurre?
Sin HSTS: El navegador se conecta sin cifrar. El sitio redirige a HTTPS. Pero en los milisegundos entre la petición HTTP y la redirección, un atacante en la misma red (Wi-Fi de cafetería, aeropuerto, hotel) puede secuestrar la conexión. Man-in-the-middle, robo de cookies, secuestro de sesión — todo trivial.
Con HSTS: El navegador ya sabe que este dominio solo acepta HTTPS. Se conecta directamente de forma cifrada. Sin petición HTTP, sin redirección, sin ventana de ataque.
Una cabecera. Una línea. Y el 72,4% de los sitios web europeos no la tiene.
Qué dicen los datos
Del Benchmark SiteGuardian con más de 700.000 sitios web europeos:
- 27,6% tiene HSTS activado
- 75,7% redirige a HTTPS — pero sin HSTS, la redirección es atacable
- 24,3% ni siquiera redirige, a pesar de tener un certificado válido
Esto significa: tres de cada cuatro sitios web con certificado TLS no lo usan de forma consistente. El certificado está, la protección no.
¿Qué es exactamente HSTS?
HTTP Strict Transport Security (RFC 6797) es una cabecera de respuesta HTTP que le dice al navegador:
"Conéctate a este dominio durante los próximos X segundos exclusivamente por HTTPS. Ignora HTTP por completo."
La cabecera tiene este aspecto:
Strict-Transport-Security: max-age=31536000; includeSubDomains
max-age=31536000— 1 año (en segundos). El navegador recuerda la instrucción durante este tiempo.includeSubDomains— se aplica a todos los subdominios (api.tu-dominio.com, mail.tu-dominio.com, etc.)
Después de la primera visita, el navegador se conecta directamente por HTTPS en cada petición posterior — sin el rodeo por HTTP.
Cómo activar HSTS
Apache (.htaccess o vhost.conf)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Requisito: mod_headers debe estar habilitado.
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
El always al final asegura que la cabecera se envía incluso en páginas de error (4xx, 5xx).
Caddy
Caddy configura HSTS automáticamente cuando HTTPS está activo. No hay que hacer nada.
Node.js / Express
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
O con el paquete helmet:
const helmet = require('helmet');
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true }));
WordPress
Los plugins "Really Simple SSL" o "HTTP Headers" activan HSTS con un solo clic. Alternativamente, añádelo al .htaccess (ver Apache arriba).
Hosting gestionado (Cloudflare, AWS, Platform.sh, etc.)
La mayoría de los proveedores de hosting no configuran HSTS por defecto. Revisa tu panel de control en "Configuración SSL/TLS" o "Cabeceras HTTP". Si la opción no está disponible, crea un archivo .htaccess en la raíz del sitio.
Tres errores que evitar
1. Configurar max-age demasiado corto
max-age=86400 (1 día) solo protege a los usuarios que visitaron en las últimas 24 horas. Comienza con 30 días (2592000), luego escala a 1 año (31536000) cuando todo funcione.
2. Olvidar includeSubDomains
Sin includeSubDomains, tus subdominios siguen accesibles por HTTP. Si mail.tu-dominio.com o intranet.tu-dominio.com no tienen TLS, solo añade includeSubDomains cuando todos los subdominios soporten HTTPS — de lo contrario dejarán de funcionar.
3. Activar HSTS sin una redirección HTTPS funcional
HSTS requiere que tu sitio web sea realmente accesible por HTTPS. Prueba antes de activar: navega a https://tu-dominio.com. Si ves un error, corrige primero la configuración del certificado TLS.
HSTS Preload: el siguiente paso
Cuando HSTS esté funcionando y tengas la certeza de que todos los subdominios soportan HTTPS, solicita la inclusión en la lista HSTS preload:
- Configura la cabecera como:
max-age=31536000; includeSubDomains; preload - Envía tu dominio en: hstspreload.org
La lista preload está integrada en Chrome, Firefox, Safari y Edge. Los dominios en la lista se cargan siempre por HTTPS — incluso en la primera visita, antes de que el navegador haya visto la cabecera HSTS.
Relación con NIS2 y el RGPD
HSTS no se menciona por nombre en ninguna ley. Pero:
-
NIS2 Art. 21(2)(d) exige "seguridad en la adquisición, el desarrollo y el mantenimiento de redes y sistemas de información, incluida la gestión y divulgación de vulnerabilidades". Una cabecera HSTS ausente es una vulnerabilidad conocida y trivialmente explotable.
-
RGPD Art. 32 exige "medidas técnicas apropiadas" para proteger los datos personales. El cifrado del transporte sin HSTS es como una cerradura sin pestillo — parece segura, pero se puede abrir con un solo movimiento.
Comprueba tu dominio
Activa HSTS, espera 5 minutos y analiza tu dominio:
El análisis te mostrará inmediatamente si HSTS está correctamente configurado, si includeSubDomains está activo y si tu dominio cumple los requisitos para la lista preload.
La próxima semana en la Parte 2: DMARC — de none a reject. Por qué policy=none no protege a nadie, y cómo alcanzar una política DMARC efectiva en tres pasos.
Este artículo forma parte de la serie "Seguridad web en la UE: 10 pasos para una mejor calificación". Datos del SiteGuardian EU Web Security Benchmark con más de 700.000 sitios web europeos.