Let's Encrypt v praxi: jak jsem přešel na HTTPS
Zdroj: ROOT.CZ
Včera jsem dostal pozvánku k betatestování služby Let's Encrypt a mohl jsem si tak získat důvěryhodný certifikát pro vlastní doménu. Rozhodl jsem se pro ruční konfiguraci a spuštění skriptů bez práv roota. Nabízím vám čerstvý kompletní postup, abyste byli připraveni na ostré spuštění Let's Encrypt.
Certifikační autorita Let's Encrypt má být
oficiálně spuštěna až v půlce listopadu, už teď ale někteří mají možnost připojit se k beta programu a vyzkoušet si generování certifikátů naostro. Stal jsem se jedním ze šťastlivců a některé mé domény byly přidány na whitelist. Mohl jsem si tedy nechat vygenerovat skutečný, platný a důvěryhodný certifikát pro svůj web www.petrkrcmar.cz.Mým
oblíbeným web serverem je Nginx, na který zatím není referenční klient letsencrypt plně připraven. Rozhodl jsem se proto pro přechod do ručního režimu. Aby to nebylo tak jednoduché, chtěl jsem si vyzkoušet i generování certifikátů bez oprávnění roota. Zvolil jsem proto metodu ověření vystavením souboru na předem známé cestě. Celý postup následuje.Protože jsem chtěl zkusit instalaci bez práv roota a bez automatických zásahů do svých konfiguračních souborů, nejprve jsem založil uživatele letsencrypt, pod kterým jsem většinu následujících kroků dělal.
# adduser letsencrypt
# su - letsencrypt
Poté jsem stáhl samotného klienta z Gitu. Dnes už existují i alternativní klienti (například i pro
Windows a IIS) a dokonce se tvoří i balíčky pro distribuce (třeba Debian). Já jsem šel ale zatím cestou čisté instalace z Gitu:$ git clone https://github.com/letsencrypt/letsencrypt
Poté bylo potřeba pod rootem spustit instalační skript bootstrap/debian.sh
,
který si ale jen pomocí standardního balíčkovacího systému stáhl potřebné
utility a knihovny.
The following NEW packages will be installed:
augeas-lenses dh-python libaugeas0 libexpat1-dev libffi-dev libmpdec2 libpython-dev
libpython2.7 libpython2.7-dev libpython3-stdlib libpython3.4-minimal libpython3.4-stdlib
libssl-dev python-chardet-whl python-colorama-whl python-dev python-distlib-whl
python-html5lib-whl python-pip-whl python-requests-whl python-setuptools-whl python-six-whl
python-urllib3-whl python-virtualenv python2.7-dev python3 python3-minimal
python3-pkg-resources python3-virtualenv python3.4 python3.4-minimal virtualenv zlib1g-dev
0 upgraded, 33 newly installed, 0 to remove and 0 not upgraded.
Need to get 28.3 MB of archives.
After this operation, 65.3 MB of additional disk space will be used.
Po této akci už jsou všechny kroky s certifikační autoritou prováděny pod neprivilegovaným účtem letsencrypt.
V adresáři /home/letsencrypt
je
potřeba založit několik podadresářů, do kterých si bude utilita ukládat své
soubory: etc, lib, log a webroot. Do posledního zmíněného umístí utilita soubory
ke splnění validačních výzev. Tento adresář si později zpřístupníme z web
serveru.
$ mkdir -p etc lib log webroot
Dále bylo potřeba upravit mírně utilitu letsencrypt-auto
,
protože se snažila volat sudo před prováděním privilegovaných akcí, které už ale
byly provedeny. Úprava je triviální, stačí připsat jediný řádek, ve kterém
přenastavíme proměnnou SUDO
na
prázdný řetězec. V následujícím příkladu je to poslední řádek.
if test "`id -u`" -ne "0" ; then
SUDO=sudo
else
SUDO=
fi
SUDO=
Pro generování slouží následující dlouhý příkaz. Nejprve zvolíme, že budeme
validovat pomocí souborů zveřejněných na webu v konkrétní cestě. Tato cesta je
určena v dalším parametru. Poté navolíme pracovní adresáře, které jsou běžně
umístěny v /etc/letsencrypt/
, /var/log/letsencrypt
a /var/letsencrypt/
–
my jsme si je ale založili v domovském adresáři. Dále automaticky souhlasíme
s varováním před vývojovou verzí klienta.
Poté následuje zásadní sekce, ve které klienta přesměrováváme na ostrou certifikační autoritu.Nezapomeňte na tuto část, jinak vám bude certifikáty generovat testovací autorita „happy hacker fake CA“, která ale není důvěryhodná a je určena jen k testům.
Další část pak tvoří seznam doménových jmen, které chceme umístit do certifikátu – v mém případě je to varianta s www a bez něj. Poslední argument určuje, že chceme pouze vytvořit certifikát a nechceme zasahovat do konfigurace běžícího web serveru (uživatel ani nemůže).
$ ./letsencrypt-auto -a webroot --webroot-path /home/letsencrypt/webroot/ \
--config-dir /home/letsencrypt/etc \
--logs-dir /home/letsencrypt/log \
--work-dir /home/letsencrypt/lib \
--agree-dev-preview \
--server https://acme-v01.api.letsencrypt.org/directory \
-d www.petrkrcmar.cz -d petrkrcmar.cz certonly
Potom si utilita do domovského adresáře doinstaluje další pythonovské balíčky.
Kvůli tomu byl předtím instalován balíček virtualenv
.
Také se zeptá na uživatelovu e-mailovou adresu.
Napoprvé se běh nepodařil a utilita oznámila, že autorita nemohla stáhnout
soubor z dané cesty na webu. Proto bylo nutné upravit konfiguraci web serveru
tak, aby při dotazu na tuto cestu četl soubory z našeho adresáře webroot
.
location ^~ /.well-known/ {
root /home/letsencrypt/webroot/;
}
Při druhém spuštění už celý proces proběhl
bez námitek a
v adresáři/home/letsencrypt/etc/live/www.petrkrcmar.cz/
se
objevily soubory s certifikátem a mým privátním klíčem:
$ ls /home/letsencrypt/etc/live/www.petrkrcmar.cz/
cert.pem chain.pem fullchain.pem privkey.pem
První soubor obsahuje samotný certifikát, druhý pak mezilehlý certifikát Let's Encrypt Authority X1, třetí je obsahuje oba a konečně poslední pak obsahuje privátní klíč. Poslední dva soubory nás budou zajímat při nastavení Nginx.
Poznámka: V logu Certificate Transparency se objevil
záznam o vydání nového certifikátu.Nyní je potřeba web serveru vysvětlit, že má začít šifrovat a kde má hledat potřebné soubory. Začátek správné sekce v mém konfiguračním souboru vypadá nyní takto:
server {
listen 443; ## listen for ipv4
listen [::]:443; ## listen for ipv6
server_name www.petrkrcmar.cz;
ssl on;
ssl_certificate /home/letsencrypt/etc/live/www.petrkrcmar.cz/fullchain.pem;
ssl_certificate_key /home/letsencrypt/etc/live/www.petrkrcmar.cz/privkey.pem;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;
# kdyz uz mame to HTTPS…
add_header Alternate-Protocol 443:npn-spdy/3; # SPDY hlavicka
add_header Content-Security-Policy upgrade-insecure-requests; # vsechno na HTTPS
…
Vidíte, že server nově poslouchá na 443 místo 80 (na 80 jsem si přidal
přesměrování), má zapnuté SSL, certifikáty míří do domovského adresáře /home/letsencrypt/
.
Poté vidíte ještě nastavení SSL session, aktivaci SPDY a hlavičku pro přepsání
všech URL z HTTP na HTTPS.
Poté stačí jen server nechat načíst novou konfiguraci a je hotovo:
# service nginx reload
Certifikát vydávaný Let's Encrypt má platnost omezenou na tři
měsíce. Proto je potřeba jej automatizovaně obnovovat, což je
jedna z šikovných vlastností utility letsencrypt
.
Stačí ji zavolat s původními parametry a ona se automaticky zeptá, zda chcete
certifikát vydat znovu.
Pokud chcete tuto obrazovku vynechat a certifikát si automaticky nechat
přegenerovat, přidejte do parametrů --renew-by-default
.
Pokud potvrdíte generování nového certifikátu, utilita vám oznámí úspěch a na
disku se objeví další certifikát. V původním adresáři se změní symlink, takže
bude ukazovat na novou verzi (stará se nemaže).
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/home/letsencrypt/etc/live/www.petrkrcmar.cz/fullchain.pem. Your
cert will expire on 2016-02-02. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
Každopádně nezapomeňte znovu načíst web server, aby si všiml změny a nový certifikát si načetl. Pro ostrý provoz se chystá lepší způsob automatického obnovování, který si bude hlídat platnost všech vydaných certifikátů pomocí cron jobu a bude automaticky v pravý čas spouštět obnovení. V betě zatím není dostupný.