Rubriky: Návody a tipy

Připravte svůj web na HTTPS-only

Prohlížeče začínají používat zabezpečený protokol HTTPS jako výchozí a stejně by k němu měli přistupovat i správci serverů a autoři obsahu webových stránek. V tomto článku se snažím vysvětlit proč a jak s tím začít.

Proč HTTPS?

Protokol HTTP (bez „S“ na konci) přenáší data webových stránek v čitelné podobě. To znamená, že jakékoliv zařízení, přes nebo kolem kterého potečou data mezi serverem a počítačem návštěvníka, si je může přečíst. Krádež přihlašovacích údajů nebo už aktivního přihlášení přes HTTP je velmi snadná.

Takto čitelně posílaný obsah může kdokoliv po cestě dokonce změnit. HTTP tedy není bezpečné ani pro obyčejné blogy, pokud vám záleží na tom, aby si návštěvníci opravdu přečetli to, co jste tam napsali, odkazy a tlačítka fungovala tak, jak jste zamýšleli, nebo aby stránka návštěvníky rovnou nepřesměrovala úplně jinam.

HTTP je jako dopis nebo pohled poslaný poštou. Nikdy nevíte, kdo si ho přečetl, nebo co s ním cestou mohl provést.

Tyto problémy řeší HTTPS (s „S“ na konci), které přidává šifrování. Posílaný obsah je šifrovaný tak, aby mu rozuměly jenom server a počítač návštěvníka, takže ho nejde po cestě přečíst. Zároveň ho nejde změnit, protože se to při pokusu o dešifrování hned pozná. Navíc je dostupné, takže už není moc důvodů, proč u HTTP zůstávat.

HTTPS jako výchozí

Autoři webových prohlížečů si tato rizika uvědomují a postupně HTTPS více prosazují. Za pomoci Mozilly vznikla certifikační autorita Let’s Encrypt, která vydává certifikáty potřebné pro nastavení HTTPS zadarmo a automatizovaně, takže je zdarma a „na kliknutí“ mohou nabízet i webhostingy.

Prohlížeče taky „tlačí“ na vás jako autory stránek a správce serverů, abyste si HTTPS opravdu nastavili. Třeba tím, že ho začínají používat jako výchozí. Pokud do adresního řádku napíše uživatel pouze doménu bez protokolu (např. jenom firefox.cz místo http://firefox.cz), Google Chrome stránku načte právě přes HTTPS. Firefox zase uživatelům nabízí režim Pouze HTTPS, kdy se pokusí o automatické přesměrování na HTTPS, a v případě nezdaru zobrazí varování.

varování v režimu Pouze HTTPS

Protokol HTTPS už několik let není jenom pro banky a prohlížeče i uživatelé ho chtějí všude, a vy byste měli taky.

Přesměrování na HTTPS

Jako první si ověřte, že váš web HTTPS podporuje. Adresu svého webu zadejte do adresního řádku včetně tohoto protokolu, tedy např. https://firefox.cz. Pokud HTTPS nemáte vůbec zprovozněné, stránky se nenačítají správně, nebo se dokonce přesměrovávají zpět na variantu s http://, nemá cenu začít přesměrováváním návštěvníků.

Pokud ale všechno funguje, je přesměrování docela jednoduché. Pozor ale na pořadí přesměrování. Na hodně stránkách narážím na to, že jako první přidávají do adresy www a až potom se starají o přesměrování na HTTPS. Nebo je pořadí správně, ale při přidání www do adresy zase použijí původní nezabezpečený protokol HTTP. To způsobí zobrazování varovných hlášek v režimu Pouze HTTPS, zabrání správnému fungování pokročilého HSTS (o něm níže), zpomalí načítání stránky a celkově degraduje bezpečnost. Níže uvedené příklady s tím počítají a jako první vždy přesměrovávají na HTTPS, jak by to mělo všude být, a až přes něj řeší případné přidání www.

Přesměrování je nejuniverzálnější nastavit rovnou na webserveru. Pokud s tím nemáte zkušenosti, pošlete odkaz na tento článek správci svého serveru nebo podpoře webhostingu, a určitě vám s tím pomohou.

Toto je ukázka z konfiguračního souboru .htaccess pro webserver Apache, a tento soubor můžete upravit sami. Správné pořadí přesměrování zajišťují direktivy RewriteCond.

###
# nejprve přesměrování na HTTPS
###
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTPS} off
	RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

###
# až potom přidání www
###
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTPS} on
	RewriteCond %{HTTP_HOST} !^www\.
	RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

Pro také velmi oblíbený webserver Nginx musí změnu udělat správce serveru, ale není to o moc složitější. Správné pořadí přesměrování je zajištěné samostatnými bloky server { } pro varianty s/bez HTTPS a www.

server {
  listen       80;
  listen       [::]:80;
  server_name  firefox.cz www.firefox.cz;
  return 301   https://$host$request_uri; # nejprve přesměrování na HTTPS
}

server {
  listen       443 ssl http2;
  listen       [::]:443 ssl http2;
  server_name  firefox.cz;
  ...
  return       301 https://www.firefox.cz$request_uri; # až potom přidání www
}

server {
  listen       443 ssl http2;
  listen       [::]:443 ssl http2;
  server_name  www.firefox.cz;
  ...
}

HSTS = přesměrování na HTTPS pro pokročilé

Drobný nedostatek postupu uvedeného výše spočívá v tom, že nezabezpečené HTTP pořád funguje a teoreticky se dá odposlechnout a změnit i ono přesměrování na HTTPS. Pomocí HSTS je prohlížeč serverem informován, že je daný web potřeba vždy navštěvovat zabezpečeně přes HTTPS a vyžadovat platný certifikát. Prohlížeč už pak nezabezpečené HTTP pro daný web nepoužije, a to ani kdyby uživatel do adresního řádku přímo napsal http://firefox.cz, a v případě chyby v nastavení zabezpečeného HTTPS ani uživateli nedovolí zobrazené varování obejít.

Pozor na to, že HSTS v kombinaci s nesprávně nastaveným HTTPS může web návštěvníkům úplně znepřístupnit. Proto si předem pečlivě přečtěte článek MDN Web Docs, kde se dozvíte technické podrobnosti, a ideálně vše vyzkoušejte na nějakém nedůležitém nebo testovací webu. Po zapnutí už efektivně nemusí jít HSTS vypnout.

Pro webserver Apache stačí ho souboru .htaccess doplnit

<IfModule mod_headers.c>
	Header always set Strict-Transport-Security "max-age=86400" "expr=%{HTTPS} == 'on'"
</IfModule>

Konfiguraci serveru Nginx bude opět muset upravit správce, a to tak, že do posledních dvou bloků server { } z předchozího příkladu doplní jediný řádek

add_header  Strict-Transport-Security "max-age=86400" always;

max-age prohlížeči říká, jak dlouho (ve vteřinách) si má informaci pamatovat a tedy jak dlouho se má HTTP obloukem vyhýbat. Hodnota 86400 odpovídá jednomu dni, ale pro ostrý provoz se doporučuje nastavit alespoň na jeden rok, tedy 31536000. Abyste mohli HSTS plně využít, např. v kombinaci s přidáním do seznamu hstspreload.org, je kromě dostatečného max-age potřeba dodržet i výše uvedené pořadí přesměrování, tedy nejdříve na HTTPS a až potom cokoliv dalšího. A už nikdy zpátky na HTTP.

Pár rad na závěr

Jestli už máte HTTPS na webu zapnuté, určitě vyzkoušejte, že na něm všechno funguje, a nakonec nastavte i zmiňované přesměrování, byť třeba bez HSTS. Vaši návštěvníci i webové vyhledávače vám poděkují. Já už stránky, kde HTTPS nefunguje, většinou hnedka opouštím.

Bezpečnost svých stránek můžete posunout ještě o dál zapnutím dalších mechanismů, se kterými vám pomůže:

  • Mozilla Observatory – sken bezpečnostních hlaviček, který pro vás spustí i některé další včetně oblíbeného Qualys SSL Labs
  • Generátor SSL konfigurace – pro webservery Apache, nginx a 17 dalších serverů a služeb
  • nápověda webhostingu – Jestli využíváte služby webhostingu, určitě se podívejte do jejich nápovědy.
  • školení – Nechci dělat reklamu konkrétnímu kurzu, ale pokud do vyhledávače zadáte „školení HTTPS/Apache/nginx“, určitě najdete takový kurz, kde si všechno hezky vyzkoušíte.

Jeden komentář k článku “Připravte svůj web na HTTPS-only”

  1. Martin Klíma napsal(a)

    Snaha vývojářů prohlížeče Firefox i dalších oragnizací a jednotlivců vnutit všem šifrovanou komuikaci mi připadá zbytečná a kontraproduktivní. Rozhodne-li se uživatel připojit k serveru nešifrovaně, má k tomu nejspíše dobrý důvod, pro nějž je ochoten strpět příslušná rizika, a není vhodné mu v tomto rozhodnutí, nejste-li ovšem příznivcem sociálního inženýrství (myšlen společenskovědní význam pojmu), bránit a chránit jej proti jeho vůli. Případ, kdy neznalý uživatel nešifrované spojení použije omylem, je vzhledem k tomu, že na tuto skutečnost nejrozšířenější prohlížeče dnes upozorňují, vyloučen.
    Pro úplnost je třeba zmínit, a bylo by vhodné to uvádět i v podobných „kazatelských“ článcích, jako je tento, že HTTPS s sebou kromě přínosu pro bezpečnost přináší i nevýhody. Zatímco hardwarové nároky šifrování již dlouhou dobu nepředstavují problém a týkaly se od začátku především serverů, stále přetrvává problém se zpětnou kompatibilitou způsobený častými změnami šifrovacích algoritmů. Samotný protokol HTTP se nemění příliš často a jeho verze HTTP 1.1 (zpětně kompatibilní se staršími) zůstává podporována jako dlouhodobý standard, což umožňuje se na současné servery připojovat z prohlížečů starých klidně přes 20 let. Naproti tomu u šifrované verze tohoto protokolu dochází k častým obměnám šifrovacích algoritmů z důvodu jejich prolomení, kdy prolomené algoritmy nebývají kvůli ztrátě důvěryhodnosti servery ani klienty nadále podporovány. To pak mívá za následek, je-li šifrování vynucené, nemožnost navázání spojení, což jistě uživatel ocení, bude-li chtít užít starou verzi prohlížeče, například na staším chytrém telefonu, nebo bude-li potřebovat nutně získat informaci z neaktualizovaného WWW serveru. Problémy u HTTPS nastávají už u prohlížečů starých jen jednotky let.