Škálovatelné nasazení Let's Encrypt
Let's Encrypt je nová certifikační autorita nabízející HTTPS zdarma a s jednoduchým nasazením. Jednoduché ale jen pokud máte jednoduchý web - například při škálovaném webu je paradoxně nasazení mnohem komplikovanější než už klasických autorit. Pokud ovšem nepoužijete trik!
Jednoduchá varianta
Cílem Let's Encrypt je maximálně automatizovat nasazení. Pokud máte jednoduchý web na VPS, tak můžete mít v provozu HTTPS zavoláním jednoho příkazu - ověření domény i nasazení certifikátu. Jak to funguje?
- aplikace Let's Encrypt spustí malý web server, který poslouchá na portu 80 a servíruje odpovědi
- vygeneruje privátní klíč a pošle žádost na https://letsencrypt.org/
- server Let's Encrypt pak zavolá URL například http://example.org/.well-known/acme-challenge/4e29342d9904d64e9e25fd3b92558e2f
- aplikace Let's Encrypt na tento požadavek odpoví hashem
- tím proběhlo ověření a je vystaven certifikát
- aplikace certifikát rovnou nainstaluje
Zní to složitě, ale z vašeho pohledu je to jeden příkaz a celé to proběhne asi za 5 sekund. Certifikát pak má platnost jen 3 měsíce, ale díky automatizaci není problém vystavovat nový třeba každý měsíc.
Škálovatelný web
Problém nastavá, pokud nemáte jednoduchý web. Například my jsme v cloudu a jedna doména tak běží paralelně třeba z 10ti serverů. Ty se navíc různě vypínají a zapínají, domény ještě různě sdílí certifikáty atd.
Při klasickém postupu by to znamenalo přepnout se do manuálního režimu, nechat si vygenerovat ověřovací klíče, ty rozkopírovat na servery a rychle spustit ověření, než se zapne nová instance. To nezní moc automaticky.
Naštěstí ale lze udělat trik. V konfiguraci všech domén (nginx) přidám tyto řádky:
location ~ /\.well-known/acme-challenge/ {
proxy_pass http://letsencrypt.simplia.cz:8081;
}
Díky tomuto jednoduchému pravidlu je každý požadavek na ověření přeposlán na jeden server, kde běží Let's Encrypt aplikace. Ta navíc ani nemusí běžet pořád. Stačí třeba jednou denně spustit a vygenerovat potřebné certifikáty.
Pro spouštění mimochodem doporučuji použít Docker - ušetříte si spoustu starostí s řešením Python závislostí. Aplikace navíc nekoliduje s vaším normálním webserverem.
docker run -it --rm -p 8081:80 --name letsencrypt \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
quay.io/letsencrypt/letsencrypt:latest
--agree-dev-preview \
--standalone-supported-challenges http-01 \
--server https://acme-v01.api.letsencrypt.org/directory \
-a standalone certonly
\ -d www.souki.cz -d souki.cz
Certifikát bude následně uložen do složky /var/lib/letsencrypt a už je potřeba jen vyřešit jeho deploy na jednotlivé servery. My to třeba řešíme přes Puppet (viz dřívější článek).
Pozor na kompatibilitu
V teorii to funguje hezky, ale v praxi to bohužel zatím použít nejde. Let's Encrypt totiž aktuálně nefunguje na Windows XP v IE ani ve Chrome a u nás má bohužel XP ještě znatelný podíl. Také se mi ho nepodařilo zprovoznit na Android 2.3, ale to jsem prý jediný :)
Zatím je ale Let's Encrypt pořád ještě v betě, tak to třeba vyřeší. Zatím to ale pro seriózní produkci bohužel není.