HTTPS nestačí, jak na HSTS a HPKP

Tipy & triky, htaccess, PHP

Jak udělat správný přechod webu na HTTPS se všemi detaily včetně HSTS a případně i HPKP? Co to vůbec je a proč prostě nestačí jen HTTPS?

HTTPS nestačí, jak na HSTS a HPKP

Proč používat HTTPS je snad jasné. Aby nikdo nemohl číst, či hůře měnit, data mezi klientem a serverem. Jenže pouze přidat k webu HTTPS certifikát nestačí. Je potřeba zabezpečené spojení vynutit, nastavit session cookie pouze pro šifrované spojení, zamezit mixed contentu a další.

Krok 1 - Certifikát, cookies a přesměrování

Jak na svůj web přidat HTTPS certifikáty je velmi odlišné hosting od hostingu, a určitě bude v jeho nápovědě. Tím to ale pouze začíná. Následně je důležité uživatele přesměrovat na HTTPS, protože to https:// na začátku nikdo psát nebude. Jednoduše to jde pomocí htaccess nebo middlewaru v použitém frameworku.

RewriteCond % off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Důležité je vybrat typ přesměrování s kódem 301, tj permanentní, protože tyto informace si prohlížeč ukládá. Při dalším navštívení se již nebude dotazovat ani serveru a přesměrování provede okamžitě. Takže hned první komunikace již bude zabezpečená.

Jak je již popsáno v článku Zabezpečení session, je vhodné zakázat odesílání session cookie jinak než po zabezpečeném připojení. Takže hurá do toho

ini_set("session.cookie_secure", true);

Zablokovaný mixed content

Pokud je web načten přes HTTPS, prohlížeče budou blokovat načítání po nezabezpečeném připojení. Proto je nutné všechny obrázky, CSS i JS soubory apod. načítat také pouze po HTTPS. A je úplně jedno, jestli to jsou soubory ze stejné, nebo úplně jiné domény.

Krok 2 - Pozor při nastavení hlavičky HSTS

HSTS je zkratka pro strict transport security, neboli vynucená zabezpečená komunikace. Pokud uživatel bude chtít navštívit stránku na HTTP, prohlížeč automaticky provede interní přesměrování na HTTPS s kódem 307. Je to podobné jako přesměrování s kódem 301, ale lepší. Navíc certifikát musí být podepsán známou certifikační autoritou.

POZOR! To ale není vše, do doby vypršení této hlavičky prohlížeč nedovolí přístup na nezabezpečené připojení, což může být velký problém. Pokud se například nepovede obnovit certifikát, nebo se na webu certifikát zruší, lidem se úplně znemožní přístup! Viz obrázek níže.
Pokud je na webu jen nepodepsaný certifikát, je zde možnost přijmout toto riziko a na web pokračovat. Pokud je ale nastaveno HSTS, už ani toto nepůjde.

HSTS Error - tuto chybovou hlášku ani obejít nejde

Nastavit HSTS lze pomocí htaccess, PHP atd. podobně jako přesměrování s kódem 301. Do hlavičky se udává její životnost, jestli platí i pro subdomény a jestli se má web zapsat do preload listu. Důležité je nezapomenout, že www je také subdoména. Proto je velmi výhodné dodat includeSubdomains, pokud to žádný systém na subdoméně nerozbije. Je to ale trochu složitější a detailněji rozepsáno níže. I zde opět platí upozornění, dobře si rozmyslet, co se nastavuje a jak.

// Čisté HSTS pro aktuální doménu, vypršení je na dobu 1 roku
header('strict-transport-security: max-age=31536000');

// Platí také pro všechny subdomény a web by se měl zapsat do preload listu
header('strict-transport-security: max-age=31536000; includeSubdomains; preload');

HSTS Preload list

HSTS je fajn, ale není TOFU (trust on first use). Pokud stránku uživatel navštíví poprvé bez HTTPS a bude na infikované síti, lze mu přesměrování podvrhnout a neustále dodávat nešifrovaný obsah. Tomu zamezuje preload list přímo v prohlížeči, který i bez prvního navštívení informuje, že tento web má nastaveno strict transport security. Celý seznam preload listu pro Chrome a Firefox je na stránce Chromium v JSON formátu.

Problém subdomén i www. u HSTS

Pokud web běží na doméně www.xx.cz a odešle se HSTS i se zapnutým includeSubDomains, pravidlo se aplikuje pouze na www.xx.cz a *.www.xx.cz. Pokud někdo v budoucnu navštíví pouze xx.cz, může zde dojít k útoku, protože první požadavek nebude zabezpečen. Řešení je, a pro preload list to je nutné, prvně provést přesměrování na HTTPS, odeslat HSTS a až poté provést přesměrování na www subdoménu.

Pokud ale uživatel navštěvuje web s www a jednoho dne jej navštíví bez www, je zde stejný problém jako výše. Proto je zde další krok, přidání jednoho zdroje, který se bude načítat bez www a pro hlavní doménu nastaví i HSTS. Toto řešení používá mimo jiné Facebook a jmenuje se HSTS pixel.

HSTS Facebook Pixel

Potřebuji HSTS a zároveň Redirect 301?

Ano, určitě ano. Důvodů je hned několik:

  • HSTS pokrývá celou doménu, případně i subdomény, redirect 301 pouze konkrétní URL. Pokud uživatel příště jde na jinou podstránku, první request je opět nešifrovaný, než přijde přesměrování. Protože redirect 301 je konkrétní URL na konkrétní URL. HSTS se postará o všechny možné URL.
  • Přesto, že redirect 301 je velmi dlouho cachovaný v prohlížeči, při vymazání cache může dojít k jeho odstranění. HSTS je cachováno v jiné cache a k jeho vymazání jen tak nedojde. Případně po mnohem větší době.
  • HSTS může být přednačteno v prohlížeči viz preload list.
  • Pokud přijde HSTS hlavička na nezabezpečeném připojení, je ignorována. Proto pro první použití je nutné uživatele přesměrovat na HTTPS a až poté mu poslat HSTS.

Krok 3 - HPKP, nebo raději ne?

Další ochrana bojuje proti podvržení certifikátu. V požadavku se tak posílají otisky klíčů, které prohlížeč přijme. Pokud by se náhodou otisk neshodoval, opět ke spojení nedojde. Zde je ale ještě větší riziko absolutního znepřístupnění webu. Stačí špatně vyměnit certifikáty, něco špatně nastavit a uživatel už se na web nepodívá. Osobně jsem tento krok na žádném webu neudělal a ani to v brzké době nemám v plánu. 

Hlubší vysvětlení

Pro zájemce o detailnější vysvětlení jak a proč mít či nemít HSTS a HPKP tu jsou články na root.cz a jakpsatweb.cz


Osobní zkušenosti s HTTPS a certifikáty, HSTS i HPKP můžete sdílet v komentářích.

Přidat komentář

Právě odpovídáte na existující komentář. Zrušit

Komentáře

Novinky z blogu

LocalStorage a Lockr

Ukládání dat v prohlížeči pomocí LocalStorage má své úskalí. Od toho je tady mini knihovna, která tyto problémy řeší a hodně práci hodně...

Další články