Let's Encrypt v praxi: jak jsem přešel na HTTPS

5. 11. 2015
Doba čtení: 5 minut

Sdílet

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.

Příprava prostředí

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.

Úpravy v domovském adresáři

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=

Generujeme certifikát

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.

Konfigurace Nginx

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

Automatické obnovování

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.

bitcoin_skoleni

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ý.

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.

Ondřej Caletka vystudoval obor Telekomunikační technika na ČVUT a dnes pracuje ve vzdělávacím oddělení RIPE NCC, mezinárodní asociaci koordinující internetové sítě.