Hlavní navigace

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

Petr Krčmář 5. 11. 2015

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.

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

Našli jste v článku chybu?

11. 11. 2015 9:07

A je to taková zátěž?

(Mimochodem, certifikát se při registraci nebude měnit, ale přidávat…)

A pokud dosáhnete takového množství uživatelů, že to bude významná zátěž pro servery, jistě peníze za wildcard certifikát od jiné CA už budou pouze drobné.

Myslím, že LE prostě řeší velkou část use cases zadarmo. Buďme za to rádi. Že neřeší některé edge cases – no a co? Svoje místo tu má i bez nich a řešení takovýchto edge cases by stálo mnoho sil s malým výsledkem.

5. 11. 2015 18:18

Jinou utilitu, která nebude záviset na Pythonu, ale na jiném „balastu“, samozřejmě kdokoli udělat může. Kdyby to udělal Let's Encrypt, tak se na Rootu objeví třicet chytrých komentářů, proč to závisí na Wgetu, OpenSSL a libjson, když to mohli napsat v Pythonu. A kdyby napsali třicet různých utilit pokaždé s jinými závislostmi, aby si každý mohl vybrat tu svou, tak by si titíž zase ztěžovali, proč k tomu je třicet různých utilit, když by stačila jedna. Takže autoři Let's Encrypt rezignovali na to…

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Root.cz: Kamery Sony se dají ovládnout na dálku

Kamery Sony se dají ovládnout na dálku

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: Flix TV má set-top box s HEVC

Flix TV má set-top box s HEVC

Vitalia.cz: Dáte si jahody s plísní?

Dáte si jahody s plísní?

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně