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í.
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.
Martin Klíma napsal(a)