Hlavní navigace

ACME.sh: snadná cesta k certifikátu od Let's Encrypt

Petr Krčmář

Klientů pro Let's Encrypt už vznikla celá řada, představíme si jeden napsaný v shellu, který je asi nejpříjemnější z nich: nemá žádné závislosti, umí vše a nasadíte ho okamžitě.

Autor tohoto článku je velkým podporovatelem Let's Encrypt a už vyzkoušel celou řadu různých klientů. Bohužel většina z nich mu nevyhovovala – buď měly ohromné množství závislostí (typicky v Pythonu), neměly implementovány všechny funkce (typicky revokace) nebo třeba nestahovaly mezilehlé certifikáty (viz přechod na nové mezilehlé X3). Žádný z klientů prostě nebyl dokonalý. Až autor narazil na ACME.sh (dříve LE.sh) a už u něj zůstal.

Projekt ACME.sh vytváří plnohodnotného klienta pro Let's Encrypt, který je kompletně napsán v shellu (je kompatibilní se shelly Bash, Dash a sh). Z toho plyne celá řada zajímavých vlastností: nemá to žádné významné závislosti (knihovny, frameworky…), triviálně se to instaluje (stačí stáhnout jeden soubor) a běží to všude, kde máte kompatibilní shell a pár běžných konzolových utilit. Navíc si vývojář klade za cíl implementaci všech funkcí protokolu ACME, takže se nemusíte bát, že by váš klient neuměl třeba revokace certifikátů.

Instalace

Instalovat je možné několika způsoby. Tradičně je to naklonováním repozitáře z Gitu a spuštěním samotného skriptu:

$ git clone https://github.com/Neilpang/acme.sh.git
$ cd ./acme.sh
$ ./acme.sh --install

Druhou variantou je sub-projekt get.acme.sh (GitHub), který servíruje triviální instalační skript. Ten se postará o přímé stažení hlavního skriptu ACME.sh a jeho spuštění. Stačí pak udělat následující:

$ curl https://get.acme.sh | sh

nebo

$ wget -O -  https://get.acme.sh | sh

V každém případě se nedoporučuje instalovat jako root a ani to vlastně není potřeba. Ideální je vytvořit samostatného uživatele (třeba letsencrypt), který nebude mít žádná privilegia a bude sloužit jen k získávání certifikátů.

Pokud je skript spuštěn s parametrem --install, založí si adresářovou strukturu v ~/.acme.sh/, vytvoří účet u Let's Encrypt (pár klíčů) a nainstaluje si cronjob pro pravidelné obnovování certifikátů. Ten vypadá takto:

0 0 * * * "/home/letsencrypt/.acme.sh"/acme.sh --cron --home "/home/letsencrypt/.acme.sh" > /dev/null

Poznámka: Pokud se vám nelíbí, kam a jak se skript nainstaluje, můžete mu při instalaci předávat parametry jako --home, --certhome, --accountconf a další.

Úprava web serveru

Nejobvyklejší metodou ověření identity je použití web root, kdy skriptu ukážete, do jakého adresáře má ukládat výzvy pro autoritu. Ta si pak na ověřované doméně sáhne do /.well-known/ a výzvy tam hledá. Pravděpodobně nechcete skriptu dávat přístup do skutečného web rootu, stačí proto do konfigurace web serveru přidat informaci o tom, kde se skutečně adresář nachází.

V Nginx stačí přidat následující:

location ^~ /.well-known/ {
    root /home/letsencrypt/webroot/;
}

Pro Apache pak podobně:

Alias /.well-known/ /home/letsencrypt/webroot/.well-known/
<Directory /home/letsencrypt/webroot/>
    AllowOverride None
    Require all granted
    Satisfy Any
</Directory>

Pokud je podobná konfigurace doručena automaticky pro všechny weby, je práce vyřešena a můžeme začít generovat certifikáty. Pozor na to, že web server musí mít právo na čtení obsahu tohoto adresáře. Doporučuji to vyzkoušet nějakým běžným souborem, který si zkusíte z webu stáhnout.

Poznámka: Pokud nechcete nebo nemůžete použít metodu web root, můžete sáhnout po metodě DNS, která ale vyžaduje interakci (manuální či automatickou) s DNS serverem. Skript disponuje DNS API různých služeb, případně si můžete napsat vlastní.

Žádáme o certifikát

Použití skriptu je pak už poměrně přímočaré, v parametrech stačí vyjmenovat správné domény a cestu pro uložení výzev. Z praktických důvodů je dobré ještě do parametrů přidat příkaz, kterým donutíme web server znovu načíst certifikáty. V takovém případě pak při automatickém obnovení server vše bez střihu vymění a jede se dál.

Konkrétní příkaz bude vypadat takto:

$ .acme.sh/acme.sh --issue -d example.com  -w /home/letsencrypt/webroot/ \
-d www.example.com -d blog.example.com -d forum.example.com \
--reloadcmd "sudo /etc/init.d/nginx reload"

Aby příkaz pro reload serveru fungoval, je potřeba přidat uživateli právo jej spouštět. Jako root tedy spustíme:

# visudo

Přidáme řádek:

letsencrypt     ALL = NOPASSWD:/etc/init.d/nginx reload

Nyní skript po každém generování certifikátu (každé tři měsíce) informuje web server, že si má znovu načíst konfiguraci.

Když nemám web server

Obvykle se certifikát získává kvůli web serveru, ale není to jediná možnost. Můžete mít třeba poštovní, XMPP nebo jiný server, na kterém web není spuštěn. Přesto pro něj chcete získat důvěryhodný certifikát. Na to skript také myslí a umí pomocí utility nc (netcat) simulovat chování web serveru jen pro chvíli ověření výzev od autority. Tady už ale budete potřebovat práva roota nebo alespoň práva poslouchání na portu 80.

Příkaz je pak velmi podobný:

$ .acme.sh/acme.sh --issue -d example.com --standalone -d www.example.com

Kde jsou moje certifikáty?

Ve výchozím stavu se váš certifikát, mezilehlý certifikát, řetězec i vygenerovaný privátní klíč objeví v adresáři ~/.acme.sh/example.com. Konkrétně vás (a hlavně váš server) budou zajímat soubory fullchain.cer s vaším i mezilehlým certifikátem a example.com.key s privátním klíčem. Tyto soubory je nutné vložit do konfigurace vašeho serveru.

Nginx:

ssl_certificate /home/letsencrypt/.acme.sh/example.com/fullchain.cer;
ssl_certificate_key /home/letsencrypt/.acme.sh/example.com/example.com.key;

Apache:

SSLCertificateFile /home/letsencrypt/.acme.sh/example.com/example.com.cer
SSLCertificateKeyFile /home/letsencrypt/.acme.sh/example.com/example.com.key
SSLCACertificateFile /home/letsencrypt/.acme.sh/example.com/ca.cer

Ve stejném adresáři se ještě nacházejí konfigurační soubory example.com.conf a example.com.ssl.conf, kam si skript uložil informace vámi zadané v parametrech. Právě tady pak hledá, kdy a jak má obnovovat certifikáty, které mají vypršet.

Revokace

Pokud chcete certifikát revokovat, budete potřebovat buď jeho privátní klíč nebo privátní klíč ke svému účtu. Minimálně ten druhý (soubor ~/.acme.sh/account.key) je dobré mít zálohovaný někde mimo, abyste v případě problémů či ztráty informací na serveru mohli revokaci provést. Pokud alespoň jeden z klíčů máte, stačí následující krok:

$ .acme.sh/acme.sh --revoke -d example.com

Další čtení

Všechny informace jsou dostupné na GitHubu projektu a na jeho wiki.

Našli jste v článku chybu?