6.12.2023
Š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.
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
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ě.
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ě.