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