Serverový certifikát - Let's Encrypt (Apache2 mod md)

Z Helpdesk
Serverový certifikát – Let's Encrypt pro Apache2 (mod_md)
Připravený skript nakonfiguruje modul mod_md webového serveru Apache2 tak, aby si certifikáty od Let's Encrypt vydával a obnovoval zcela automaticky – bez externího ACME klienta a bez démona navíc.
Certifikační autorita Let's Encrypt (certifikát s doménovým ověřením, platnost 90 dní)
Pro koho Správci webového serveru Apache2 na systému Debian (deriváty Debianu a Ubuntu netestovány)
Automatická obnova Ano – zajišťuje přímo modul mod_md, Apache se po obnově sám reloadne
Zdroj skriptu ipmil.civ.zcu.cz/linux/apache2-mod_md

Co skript udělá

Skript md.sh po spuštění:

  • projde konfigurace v /etc/apache2/sites-enabled/ a posbírá všechna jména z direktiv ServerName a ServerAlias,
  • u každého jména ověří, že jeho DNS záznam směřuje na tento server (jména, která nesměřují, vynechá),
  • povolí moduly md a ssl a vygeneruje konfiguraci /etc/apache2/conf-available/md-zcu.conf,
  • zakomentuje případné staré direktivy SSLCertificateFile / SSLCertificateKeyFile / SSLCertificateChainFile v dotčených konfiguracích (před úpravou vytvoří zálohu *.bak_<datum>),
  • nainstaluje hook skript /opt/mod_md/md-message.sh, který při obnově certifikátu dočasně otevře port 80 v iptables a po instalaci certifikátu provede apache2ctl graceful,
  • provede test konfigurace a reload/restart Apache.

Logy najdete v adresáři /var/log/mod_md/.

Důležité: Skript získává certifikáty pro všechny stránky v adresáři sites-enabled.

Požadavky před spuštěním

  1. V adresáři /etc/apache2/sites-enabled/ jsou nakonfigurovány všechny stránky, pro které chcete certifikát získat.
  2. Každá konfigurace obsahuje všechny direktivy ServerName a ServerAlias odpovídající doméně a jejím aliasům.
  3. Alespoň v jedné konfiguraci ve VirtualHost *:443 je nastaven platný e-mail v direktivě ServerAdmin (např. admin@civ.zcu.cz).
  4. DNS záznamy všech jmen směřují na tento server a server je z internetu dostupný na portu 80.

Pozor: Pokud jsou SSL direktivy (SSLCertificateFile apod.) definovány mimo konfigurace v sites-enabled, skript je nenajde. V takovém případě je zakomentujte ručně, jinak konfigurace Apache skončí chybou.

Postup

1. Stažení skriptu

git clone https://ipmil.civ.zcu.cz/linux/apache2-mod_md.git
cd apache2-mod_md
chmod +x md.sh

Skript musí běžet jako root – zapisuje do konfigurace Apache, do /opt/mod_md i do /etc/sudoers.d/. Bez oprávnění root skončí hláškou Skript musí být spuštěn jako root!.

2. Test se STAGING certifikátem

Nejprve spusťte skript v testovacím režimu:

sudo ./md.sh -t

Testovací režim používá testovací ACME API Let's Encrypt (acme-staging-v02.api.letsencrypt.org). Vydaný STAGING certifikát není důvěryhodný pro produkční provoz, ale ověříte si s ním správnost konfigurace bez rizika vyčerpání limitů Let's Encrypt na vydávání certifikátů.

Úspěch ověříte kontrolou certifikátu webové stránky – uvidíte vydavatele ve tvaru (STAGING) Counterfeit Cashew R10 nebo podobnou testovací podobu.

3. Nasazení produkčního certifikátu

Po ověření STAGING certifikátu spusťte skript bez parametru:

sudo ./md.sh

Skript sám odstraní data STAGING certifikátů a mod_md vydá certifikáty produkční. Vydání může po reloadu Apache chvíli trvat (obvykle do několika minut) – průběh sledujte v logu /var/log/mod_md/apache2-md-message.log.

4. Ověření certifikátu a stará cache v prohlížeči

Pozor na cache prohlížeče: pokud jste si stránku prohlíželi se STAGING certifikátem, může prohlížeč i po přechodu na produkční certifikát chvíli zobrazovat starý STAGING certifikát – drží si otevřené TLS spojení a session cache. Skutečně nasazený certifikát proto ověřte přímo na serveru:

openssl s_client -connect example.zcu.cz:443 -servername example.zcu.cz </dev/null 2>/dev/null \
  | openssl x509 -noout -issuer -subject -dates

Pokud příkaz ukazuje produkční certifikát (vydavatel O = Let's Encrypt bez označení STAGING) a prohlížeč stále zobrazuje testovací certifikát, stačí prohlížeč úplně ukončit a spustit znovu, použít anonymní okno či jiný prohlížeč, nebo chvíli vyčkat. Nejde o chybu serveru ani skriptu.

Pokud ale i openssl stále vrací STAGING certifikát, produkční certifikát zatím nebyl aktivován. Zkontrolujte /var/log/apache2/error.log a zapněte podrobnější logování mod_md podle části Řešení potíží. Skript kvůli tomu nespouštějte znovu – opakované žádosti zbytečně čerpají limit Let's Encrypt.

Řešení potíží

Rate limit Let's Encrypt

Produkční certifikáty podléhají limitu: maximálně 5 certifikátů pro stejnou sadu domén za 7 dní (168 hodin). Po vyčerpání limitu je nutné čekat; místa se uvolňují tempem cca 1 certifikát za 34 hodin. Právě proto vždy nejprve testujte s parametrem -t.

V logu se limit projeví chybou urn:ietf:params:acme:error:rateLimited, například:

[md:debug] md_result.c(254): md[example.zcu.cz] while[Creating new order]
problem[urn:ietf:params:acme:error:rateLimited]
detail[too many certificates (5) already issued for this exact set of domains
in the last 168h0m0s, retry after 2025-02-19 23:09:59 UTC:
see https://letsencrypt.org/docs/rate-limits/]

Rozhodující je údaj za retry after – je to okamžik, kdy bude možný další pokus. V ukázce byla chyba zapsána 18. 2. 2025 ve 14:31 UTC a další žádost šla podat až 19. 2. 2025 ve 23:09 UTC, tedy přibližně o 34 hodin později.

Podrobnosti: letsencrypt.org/docs/rate-limits.

Podrobnější logování mod_md

Do souboru /etc/apache2/apache2.conf přidejte:

LogLevel md:debug

(případně LogLevel md:trace5 pro maximální podrobnost) a sledujte /var/log/apache2/error.log.

Alternativa: certbot bez mod_md

Pokud neprovozujete Apache2, nebo dáváte přednost klasickému klientovi, lze certifikát od Let's Encrypt získat i nástrojem certbot (na Debianu stačí apt install certbot):

certbot certonly --standalone -d example.zcu.cz -m vas-email@zcu.cz --agree-tos

Režim --standalone vyžaduje volný port 80 (běžící webový server na chvíli zastavte, nebo místo toho použijte --webroot -w /var/www/html). Certifikát a klíč najdete v /etc/letsencrypt/live/example.zcu.cz/, obnovu zajišťuje automaticky systemd timer certbot.timer.

Chcete-li však certifikát s ověřením organizace, použijte raději doporučenou ACME automatizaci přes CESNET TCS.

Související stránky