SSLmentor

Kvalitní TLS/SSL certifikáty pro webové stránky a internetové projekty.

Lego & ACME WildCard

Lego & ACME WildCard

ACME klient Lego

Detailní návod pro nasazení hvězdičkového WildCard SSL certifikátu přes ACME klienta Lego a API DNS validaci u webhostingu VEDOS. Postup je určený pro certifikáty typu example.com a *.example.com, kde má být obnova automatická bez ručního zadávání TXT záznamů. V návodu je použit ACME certifikát od certifikační autority Certum. Použitý certifikát slouží pouze jako příklad – princip fungování i postup nasazení ACME jsou stejné u všech certifikačních autorit.

Návod používá syntaxi ověřenou na Lego 5.2.2. Lego v5 změnilo některé parametry oproti starším verzím, proto při chybě typu flag provided but not defined ověřte správnou syntaxi pomocí lego accounts register --help, lego run --help nebo lego --help.

Základní pojmy

  • ACME – protokol pro automatizované vydávání a obnovu SSL/TLS certifikátů.
  • Lego – ACME klient napsaný v Go. Umí DNS validaci přes mnoho DNS providerů (seznam podporovaných DNS providerů).
  • DNS-01 – validace přes DNS TXT záznam _acme-challenge. Je nutná pro WildCard certifikáty.
  • EAB kid + hmac – External Account Binding (EAB) údaje od certifikační autority. Propojují Certbot s účtem nebo produktem.
  • VEDOS WAPI – API rozhraní VEDOS, přes které Lego vytváří a maže DNS TXT záznamy.

Ve všech uvedených příkladech nahraďte doménu example.com vlastní doménou.

Instalace Lego

apt update
apt install -y curl tar

cd /tmp
LEGO_URL=$(curl -s https://api.github.com/repos/go-acme/lego/releases/latest | sed -n 's/.*"browser_download_url": "\(.*linux_amd64.tar.gz\)".*/\1/p' | head -n1)
echo "$LEGO_URL"
curl -L -o lego.tar.gz "$LEGO_URL"
tar -xzf lego.tar.gz
install -m 0755 lego /usr/local/bin/lego
lego --version
Příkaz / hodnota Co dělá / čím nahradit
apt update Aktualizuje seznam balíčků.
apt install -y curl tar Nainstaluje nástroje pro stažení a rozbalení Lego.
LEGO_URL=... Zjistí URL posledního Linux amd64 release balíčku.
curl -L -o lego.tar.gz Stáhne archiv Lego.
tar -xzf lego.tar.gz Rozbalí archiv.
install -m 0755 lego /usr/local/bin/lego Nainstaluje Lego jako spustitelný systémový příkaz.
lego --version Ověří nainstalovanou verzi Lego.

Webhosting DNS API

V tomto návodě je použito DNS API od webhostingu Vedos. Pro webhosting Vedos je nutné aktivovat WAPI a také vyplnit povolené IP adresy a WAPI heslo.
Klient LEGO podporuje stovky dalších DNS poskytovatelů. Jejich seznam neleznete na webových stránkách LEGO - seznam podporovaných DNS providerů

IP adresy VPS serveru

curl -4 ifconfig.me
curl -6 ifconfig.me
Příkaz / hodnota Co dělá / čím nahradit
curl -4 ifconfig.me Zobrazí veřejnou IPv4 adresu serveru, kterou je potřeba povolit ve VEDOS WAPI.
curl -6 ifconfig.me Zobrazí veřejnou IPv6 adresu serveru, pokud ji VPS používá. I tuto adresu je vhodné povolit ve VEDOS WAPI.

Do pole Povolené IP adresy vložte všechny odchozí IP adresy vašeho serveru, typicky IPv4 i IPv6. Hodnoty se oddělují mezerou. VEDOS povolí API požadavky pouze z uvedených IP adres.

Důležité: Pokud povolíte jen IPv4 a některý WAPI request odejde přes IPv6, může vydání certifikátu projít, ale úklid TXT záznamů selže chybou Access not allowed from this IP address.

Doporučené hodnoty ve VEDOS

Pole Doporučená hodnota
Aktivovat WAPI Zapnuto
Povolené IP adresy Veřejná IPv4 a případně IPv6 adresa VPS
Způsob notifikací POLL fronta
Preferovaný protokol JSON
Heslo Vygenerované WAPI heslo, nikoli běžné heslo do administrace

Apache, webroot

Základní nastavení Apache je podpůrná část. DNS validace běží přes DNS API, ne přes HTTP, ale Apache vhost je potřeba pro obsluhu webu po vydání certifikátu.

›› Zobrazit/Skrýt sekci

Před spuštěním nahraďte hodnotu example.com v řádku DOMAIN="example.com" vlastní doménou bez hvězdičky. Proměnná $DOMAIN se pak použije v dalších příkazech pro cesty, Apache vhost a testovací stránku.

cd /var/www
apt update
apt install -y apache2
systemctl enable --now apache2
a2enmod rewrite headers ssl
systemctl reload apache2

DOMAIN="example.com"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
Příkaz / hodnota Co dělá / čím nahradit
cd /var/www Přejde do adresáře, kde se běžně ukládají webové soubory.
apt update Aktualizuje seznam balíčků.
apt install -y apache2 Nainstaluje Apache; -y automaticky potvrdí instalaci.
systemctl enable --now apache2 Zapne Apache po startu serveru a zároveň ho spustí.
a2enmod rewrite headers ssl Zapne moduly pro redirecty, hlavičky a HTTPS.
DOMAIN="example.com" Nastaví proměnnou s doménou. Nahraďte example.com vlastní doménou.
mkdir/chown/chmod/echo Vytvoří webroot, nastaví práva pro Apache a uloží jednoduchou testovací stránku.

HTTP vhost pro apex i subdomény:


cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
    ServerName $DOMAIN
    ServerAlias *.$DOMAIN

    DocumentRoot /var/www/$DOMAIN/public
    <Directory /var/www/$DOMAIN/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
    CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF

a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
Příkaz / hodnota Co dělá / čím nahradit
cat > ... <<EOF Zapíše nový Apache HTTP vhost do souboru v sites-available.
ServerName $DOMAIN Hlavní doména virtual hostu.
ServerAlias *.$DOMAIN Povolí obsluhu libovolné první úrovně subdomény.
DocumentRoot Adresář, ze kterého Apache servíruje obsah.
a2ensite $DOMAIN.conf Zapne vhost.
apache2ctl configtest Ověří syntaxi Apache konfigurace.
curl -I http://$DOMAIN Ověří HTTP odpověď domény.

Konfigurační soubor Lego

Doporučený postup pro Lego v5 je uložit nastavení do konfiguračního souboru. Systemd služba pak nemusí obsahovat dlouhý příkaz s doménami, DNS providerem a hooky.

VEDOS env soubor

Před spuštěním nahraďte example.com vlastní doménou. Soubor vedos-example.com.env bude obsahovat přihlašovací údaje k VEDOS WAPI, proto ho ukládáme do /etc/lego a nastavíme mu omezená práva.

DOMAIN="example.com"

mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
Příkaz / hodnota Co dělá / čím nahradit
DOMAIN="example.com" Nastaví doménu pro další příkazy. Nahraďte vlastní doménou.
mkdir -p /etc/lego/$DOMAIN Vytvoří adresář pro Lego data a konfiguraci dané domény.
nano /etc/lego/vedos-$DOMAIN.env Otevře soubor pro VEDOS API proměnné.

V konfiguraci níže nahraďte WEDOS_LOGIN vaším VEDOS loginem a WEDOS_WAPI_PASSWORD heslem vygenerovaným ve VEDOS WAPI. Hodnoty timeoutu a intervalu můžete ponechat.

WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
Příkaz / hodnota Co dělá / čím nahradit
WEDOS_USERNAME VEDOS login účtu, který spravuje DNS zónu.
WEDOS_WAPI_PASSWORD WAPI heslo vygenerované ve VEDOS administraci.
WEDOS_PROPAGATION_TIMEOUT Maximální doba čekání na DNS propagaci v sekundách.
WEDOS_POLLING_INTERVAL Interval mezi kontrolami DNS propagace.
WEDOS_TTL TTL TXT záznamů vytvořených pro ACME challenge.
chmod 600 /etc/lego/vedos-$DOMAIN.env

Soubor lego.yml

Před uložením YAML konfigurace nahraďte example.com vlastní doménou, *.example.com wildcard názvem, vas@email.cz vaším kontaktním e-mailem a hodnoty KID / HMAC údaji z objednávky ACME certifikátu. Názvy jako certum-example nebo example-com-wildcard jsou interní popisky; můžete je ponechat, ale u více domén je vhodné je přejmenovat podle domény.

nano /etc/lego/$DOMAIN/lego.yml
storage: /etc/lego/example.com

accounts:
  certum-example:
    server: certum
    email: vas@email.cz
    acceptsTermsOfService: true
    eab:
      kid: KID
      hmacKey: HMAC

servers:
  certum:
    url: https://acme.certum.pl/directory

challenges:
  vedos-dns:
    dns:
      provider: edos
      envFile: /etc/lego/vedos-example.com.env
      resolvers:
        - 1.1.1.1:53

certificates:
  example-com-wildcard:
    account: certum-example
    challenge: vedos-dns
    domains:
      - example.com
      - "*.example.com"
    renew:
      days: 30

hooks:
  deploy:
    command: systemctl reload apache2
Příkaz / hodnota Co dělá / čím nahradit
storage Adresář pro Lego účet, certifikáty a metadata.
accounts Definice ACME účtu včetně e-mailu a EAB údajů.
servers.certum.url ACME endpoint Certum.
challenges.vedos-dns DNS-01 validace přes VEDOS provider.
envFile Soubor s VEDOS API přihlašovacími údaji.
certificates Seznam certifikátů, které má Lego spravovat.
domains Apex doména a wildcard doména v certifikátu.
renew.days Kolik dní před expirací má Lego obnovovat.
hooks.deploy.command Příkaz po úspěšném vydání nebo obnově, zde reload Apache.
chmod 600 /etc/lego/$DOMAIN/lego.yml

Soubor lego.yml obsahuje EAB HMAC, proto musí mít omezená práva. V zákaznické dokumentaci uvádějte pouze placeholdery.

Vydání certifikátu

Před spuštěním nahraďte example.com v cestě doménou, kterou jste použili při vytváření adresáře. První spuštění vytvoří ACME účet, nastaví DNS TXT záznamy přes DNS API, provede DNS-01 validaci a uloží certifikát.

lego --config /etc/lego/$DOMAIN/lego.yml

Během čekání může Lego vypisovat:

dns01: waiting for record propagation timeout=1h0m0s interval=30s
Příkaz / hodnota Co dělá / čím nahradit
lego --config Spustí Lego podle konfiguračního souboru. Při prvním běhu vydá certifikát, při dalších bězích řeší obnovu.
dns01: waiting for record propagation Lego vytvořilo TXT záznam a čeká, až bude viditelný v DNS.
timeout=1h0m0s Maximálně čeká jednu hodinu.
interval=30s DNS kontroluje každých 30 sekund.

To znamená, že Lego kontroluje DNS každých 30 sekund a čeká maximálně 1 hodinu. Po úspěchu ověřte soubory:

ls -la /etc/lego/$DOMAIN/certificates/

Adresář certificates/ obsahuje vydaný .crt, .key, issuer certifikát a metadata.

Alternativní CLI postup pro Lego v5

›› Zobrazit/Skrýt sekci

Pokud nepoužíváte konfigurační soubor, EAB se u Lego v5 zadává při registraci účtu. Před spuštěním nahraďte example.com vlastní doménou, vas@email.cz vlastním e-mailem a KID / HMAC hodnotami z objednávky.

lego accounts register \
  --path /etc/lego/example.com \
  --server https://acme.certum.pl/directory \
  --email vas@email.cz \
  --accept-tos \
  --eab \
  --eab.kid 'KID' \
  --eab.hmac 'HMAC'
Příkaz / hodnota Co dělá / čím nahradit
lego accounts register Zaregistruje ACME účet ruční CLI cestou bez lego.yml.
--path Adresář pro účet a certifikáty.
--server Certum ACME endpoint.
--email Kontaktní e-mail.
--accept-tos Souhlas s podmínkami služby.
--eab Zapne External Account Binding.
--eab.kid / --eab.hmac EAB údaje z CertManageru.

Výpis účtů. V cestě opět použijte stejnou doménu jako v předchozím příkazu:

lego accounts list --path /etc/lego/example.com

Vydání certifikátu už bez EAB parametrů. Nahraďte example.com vlastní doménou a *.example.com wildcard názvem.

set -a
. /etc/lego/vedos-example.com.env
set +a

lego run \
  --path /etc/lego/example.com \
  --server https://acme.certum.pl/directory \
  --email vas@email.cz \
  --dns vedos \
  --dns.resolvers 1.1.1.1:53 \
  --domains example.com \
  --domains '*.example.com'
Příkaz / hodnota Co dělá / čím nahradit
set -a Automaticky exportuje proměnné načtené ze souboru.
. /etc/lego/vedos-example.com.env Načte VEDOS API proměnné do aktuálního shellu.
set +a Vypne automatický export proměnných.
lego run Vydá nebo obnoví certifikát bez konfiguračního souboru.
--dns vedos Použije DNS API.
--domains Domény, které budou v certifikátu.

Nasazení certifikátu do Apache

Před vytvořením HTTPS vhostu nahraďte example.com vlastní doménou ve jménu souboru, hodnotách ServerName, ServerAlias, cestách k webrootu i cestách k certifikátu. Tyto cesty musí odpovídat doméně použité v Lego konfiguraci.


cat > /etc/apache2/sites-available/example.com-le-ssl.conf <<'EOF'
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName example.com
    ServerAlias *.example.com

    DocumentRoot /var/www/example.com/public
    <Directory /var/www/example.com/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile /etc/lego/example.com/certificates/example.com.crt
    SSLCertificateKeyFile /etc/lego/example.com/certificates/example.com.key

    ErrorLog ${APACHE_LOG_DIR}/example.com_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_ssl_access.log combined
</VirtualHost>
</IfModule>
EOF

a2ensite example.com-le-ssl.conf
apache2ctl configtest
systemctl reload apache2

curl -I https://example.com
curl -I https://test.example.com
Příkaz / hodnota Co dělá / čím nahradit
cat > ...-le-ssl.conf Vytvoří Apache HTTPS vhost.
ServerName / ServerAlias Určuje apex doménu a wildcard subdomény.
SSLCertificateFile Cesta k certifikátu z Lego.
SSLCertificateKeyFile Cesta k privátnímu klíči z Lego.
a2ensite Zapne HTTPS vhost.
systemctl reload apache2 Načte novou konfiguraci Apache.
curl -I https://... Ověří HTTPS odpověď.

Automatická obnova

Lego umí certifikát obnovit, ale samo po instalaci nevytvoří systemd timer. Pravidelné spouštění se nastavuje přes vlastní service a timer. Před vložením nahraďte example-com ve jménu service/timeru vlastním bezpečným názvem bez teček, například mojedomena-cz, a nahraďte example.com v cestě ke konfiguraci vlastní doménou.


cat > /etc/systemd/system/lego-example-com-renew.service <<'EOF'
[Unit]
Description=Renew Certum WildCard SSL for example.com using Lego and VEDOS DNS
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/lego --config /etc/lego/example.com/lego.yml
EOF

cat > /etc/systemd/system/lego-example-com-renew.timer <<'EOF'
[Unit]
Description=Daily Lego renewal check for example.com

[Timer]
OnCalendar=*-*-* 03:20:00
RandomizedDelaySec=1800
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable --now lego-example-com-renew.timer
systemctl list-timers | grep lego
Příkaz / hodnota Co dělá / čím nahradit
lego-example-com-renew.service Systemd služba pro jednorázové spuštění Lego renew/run.
Type=oneshot Služba se spustí, provede práci a skončí.
ExecStart Spustí Lego podle lego.yml.
lego-example-com-renew.timer Systemd timer, který službu pravidelně spouští.
OnCalendar Čas denní kontroly.
RandomizedDelaySec Náhodné zpoždění, aby se požadavky nerozběhly přesně ve stejný čas.
Persistent=true Doběhne zmeškané spuštění po startu serveru.
systemctl enable --now Zapne timer a hned ho aktivuje.

Bezpečný test služby:

systemctl start lego-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
Příkaz / hodnota Co dělá / čím nahradit
systemctl start ...service Ručně spustí renewal službu pro test.
journalctl -u ... Zobrazí poslední logy služby.

Pokud certifikát není blízko expirace, Lego může oznámit, že obnova není potřeba. To je správné chování.

Časté chyby

Neznámý parametr u Lego

U Lego v5 jsou EAB parametry --eab.kid a --eab.hmac. Parametry patří vždy ke konkrétnímu subcommandu.

lego accounts register --help
lego accounts list --help
lego run --help

Cleanup TXT záznamů selže na nepovolené IP

Cleaning up failed ... Access not allowed from this IP address (2a02:...)

Do VEDOS WAPI povolených IP adres přidejte také IPv6 adresu serveru. Certifikát může být vydaný správně, ale TXT záznamy po validaci zůstanou v DNS.

Ověřovací checklist

dig TXT _acme-challenge.example.com +short
lego --config /etc/lego/example.com/lego.yml
systemctl status lego-example-com-renew.timer
apache2ctl configtest
curl -I https://example.com
Příkaz / hodnota Co dělá / čím nahradit
dig TXT Ověří TXT záznamy v DNS.
lego --config Spustí Lego konfiguraci.
systemctl status Zobrazí stav timeru.
apache2ctl configtest Ověří Apache konfiguraci.
curl -I Ověří HTTPS odpověď.

Zpět na Nápovědu
Našli jste chybu nebo něčemu nerozumíte? Napište nám!

CA Sectigo
CA RapidSSL
CA Thawte
CA GeoTrust
CA DigiCert
CA Certum