Chybí Strict-Transport-Security
Co to je
Vaše stránky neposílají hlavičku Strict-Transport-Security (HSTS). Tahle hlavička řekne prohlížeči „na tenhle web už nikdy neviz HTTP, vždycky rovnou HTTPS“.
Proč je to problém
I když máte funkční HTTPS i HTTP redirect, první návštěva má slabé místo. Uživatel napíše example.cz — prohlížeč začne pokusem o HTTP. Pokud je v té chvíli mezi vámi a serverem útočník (veřejná Wi-Fi, kompromitovaný router), může:
- Zachytit cookies, které prohlížeč pošle s HTTP požadavkem.
- Provést SSL strip — držet uživatele na HTTP a sám komunikovat se serverem přes HTTPS.
S HSTS prohlížeč ví předem, že se na example.cz nesmí jít přes HTTP, a útok se nedaří.
Jak to opravit
Krok 1 — ujistěte se, že HTTPS je stabilní
HSTS prohlížeč „naučí“ na delší období. Když pak HTTPS rozbijete (expirovaný cert, omylem vypnuté SSL), váš web bude pro vracející návštěvníky nedostupný — prohlížeč odmítne i fallback na HTTP.
Před zapnutím HSTS si ověřte:
- Auto-renew certifikátu funguje (Let’s Encrypt, certbot, alerting).
- Všechny subdomény, které chcete krýt, mají platný cert.
Krok 2 — nastavit krátkou hodnotu pro test
Strict-Transport-Security: max-age=3005 minut. Když se něco rozbije, do 5 minut to odezní. Sledujte uptime a spustěte několik testů.
Krok 3 — nasadit produkční hodnotu
Strict-Transport-Security: max-age=15552000; includeSubDomainsmax-age=15552000= 6 měsíců.includeSubDomains= platí i na všechny subdomény. Pozor: pokud máte subdoménu bez HTTPS (legacy admin, intranet), tahle direktiva ji rozbije.
Krok 4 (volitelný) — preload
Pokud chcete být ve vestavěném seznamu prohlížečů (Chrome, Firefox, Safari) a mít HSTS i pro úplně první návštěvu z čistého prohlížeče:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preloadPak doménu zaregistrujte na hstspreload.org.Tento krok je obtížně reverzovatelný — vyřazení ze seznamu trvá týdny až měsíce.
Konkrétní konfigurace
nginx:
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;Apache:
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"Cloudflare: SSL/TLS → Edge Certificates → HTTP Strict Transport Security — UI checkbox.