6.12.2023

foto Petr Bravenec

Petr Bravenec
Twitter: @BravenecPetr
+420 777 566 384
petr.bravenec@hobrasoft.cz

Úvod

Šifrování je dnes vyžadovanou součástí spousty WWW stránek i různých síťových služeb (VPN, pošta, cups atd). Vystavit certifikát Let's Encrypt pomocí utilit jako je certbot nebo acme.sh je snadné a dobře zdokumentované. Na mnoha serverech používáme právě utilitu acme.sh, u které je však zásadní problém s restartem serverů po obnově certifikátu. Není to složité, ale je to špatně zdokumentované a nikdo pořádně neví, jak na to.

Krátce

Vytvořte si jednoduchý skript pro překopírování certifikátů, například /usr/local/bin/certificates-changed:

#!/bin/bash

cp /root/.acme.sh/www.hobrasoft.cz/www.hobrasoft.cz.cer /etc/ssl/apache/www.hobrasoft.cz.crt
cp /root/.acme.sh/www.hobrasoft.cz/www.hobrasoft.cz.key /etc/ssl/apache/www.hobrasoft.cz.key
systemctl restart apache2

U svých již vystavených certifikátů doplňte konfigurační soubor /root/.acme.sh/www.hobrasoft.cz/www.hobrasoft.cz.conf o parametr Le_RenewHook:

Le_Domain='www.hobrasoft.cz'
Le_PreHook=''
Le_PostHook=''
Le_RenewHook='/usr/local/bin/certificates-changed'
...

Periodické volání acme.sh s parametrem --cron by nyní mělo certifikáty jak obnovit (to bývá bez problémů), tak nasadit. V crontab by měl být řádek s voláním acme.sh (udělá se automaticky při instalaci):

0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh

Podrobně

Nápověda k acme.sh říká, že existují parametry --pre-hook <command> (příkaz určený ke spuštění před získáním certifikátu), --post-hook <command> (příkaz určený ke spuštění po úspěšném či neúspěšném získání certifikátu) a --renew-hook <command> (příkaz určený ke spuštění po obnovení certifikátu), ale jakékoliv pokusy o jejich použití obvykle končí nezdarem. Je to proto, že tyto parametry jsou aktivní pouze při vytvoření nového certifikátu a neslouží k vyvolání požadovaného hooku, a u dalších akcí (typicky renew) jsou tyto parametry ignorované.

První volání acme.sh při vystavování certifikátu proto vypadá správně takto:

/root/.acme.sh/acme.sh --standalone --listen-v6 --issue --domain www.hobrasoft.cz \
    --pre-hook /usr/local/bin/certificates-changed-pre \
    --post-hook /usr/local/bin/certificates-changed-post \
    --renew-hook /usr/local/bin/certificates-changed 

Je celkem zbytečné se pokoušet používat parametry --deploy a --deploy-hook – nefungují, jak byste očekávali. Při prvním vystavení certifikátu nasaďte certifikát ručně. Po úspěšném vystavení certifikátu vypadá konfigurační soubor /root/.acme.sh/www.hobrasoft.cz/www.hobrasoft.cz.conf přibližně takto:

Le_Domain='www.hobrasoft.cz'
Le_PreHook=''
Le_PostHook=''
Le_RenewHook='__ACME_BASE64__START_L3Vzci9sb2NhbC9iaW4vY2VydGlmaWNhdGVzLWNoYW5nZWQ=__ACME_BASE64__END_'
...

Řetězce __ACME_BASE64... se není třeba lekat. Jde o base64 zakódovaný řetězec /usr/local/bin/certificates-changed a funguje stejně, jako otevřený text.

Parametry --pre-hook a --post-hook jsou vhodné, pokud vystavujete certifikáty například pro haproxy. Zde je vhodné před pokusem o obnovení certifikátu haproxy zastavit, obnovit certifikát (voláním acme.sh s parametrem --standalone) a poté haproxy opět spustit. Bez dočasného zastavení by se haproxy a acme.sh pohádali o port 80 – pokus o obnovení certifikátu by nedopadl úspěšně.

Závěrem

Automatická obnova certifikátů pomocí acme.sh a spolehlivé zprovoznění takto triviálního požadavku může někdy trvat celé roky, protože máte pouze 4 šance na vyzkoušení ročně.

Internet je velmi skoupý na informace, na spolehlivý návod jsem nikdy nenarazil. Tento článek si proto klade ambice na nejcitovanější text o automatické obnově certifikátů na světě.

Hobrasoft s.r.o. | Kontakt