SSLmentor

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

Lego & ACME WildCard

Lego & ACME WildCard

ACME klient Lego - WildCard SSL

Podrobný návod na nasadenie hviezdičkového WildCard SSL certifikátu cez ACME klienta Lego a API DNS validáciu s webhostingom VEDOS. Postup je určený pre certifikáty typu example.com a *.example.com, kde by obnova mala prebiehať automaticky bez ručného zadávania TXT záznamov. Návod používa ACME certifikát od certifikačnej autority Certum. Použitý certifikát slúži len ako príklad – princíp fungovania a postup nasadenia ACME sú rovnaké pre všetky certifikačné autority.

Návod používa syntax overenú na Lego 5.2.2. Lego v5 zmenilo oproti starším verziám niektoré parametre, takže v prípade chyby ako flag provided but not defined overte správnu syntax pomocou lego accounts register --help, lego run --help alebo lego --help.

Základné pojmy

  • ACME – protokol na automatizované vydávanie a obnovu SSL/TLS certifikátov.
  • Lego – ACME klient napísaný v jazyku Go. Dokáže vykonať DNS validáciu cez množstvo DNS poskytovateľov (zoznam podporovaných DNS poskytovateľov).
  • DNS-01 – validácia cez DNS TXT záznam _acme-challenge. Je vyžadovaná pre WildCard certifikáty.
  • EAB kid + hmac – údaje External Account Binding (EAB) od certifikačnej autority. Prepájajú ACME klienta s účtom alebo produktom.
  • VEDOS WAPI – API rozhranie VEDOS, cez ktoré Lego vytvára a maže DNS TXT záznamy.
  • Systemd služba - konfiguračný súbor, ktorý hovorí systému Linux, ako spustiť aplikáciu a udržať ju v chode aj po reštarte servera.

Vo všetkých uvedených príkladoch nahraďte doménu example.com svojou vlastnou doménou.

Inštalácia 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

Po úspešnej inštalácii odporúčame odstrániť dočasné súbory.

rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
Príkaz / hodnota Čo robí / čo nahradiť
apt update Aktualizuje zoznam balíkov.
apt install -y curl tar Nainštaluje nástroje na stiahnutie a rozbalenie Lego.
LEGO_URL=... Nájde URL najnovšieho release balíka pre Linux amd64.
curl -L -o lego.tar.gz Stiahne archív Lego.
tar -xzf lego.tar.gz Rozbalí archív.
install -m 0755 lego /usr/local/bin/lego Nainštaluje Lego ako spustiteľný systémový príkaz.
lego --version Overí nainštalovanú verziu Lego.

Poskytovateľ DNS API

Tento návod používa DNS API od registrátora domén Vedos, ktorý ponúka API na správu DNS registrovaných domén. Pre webhosting Vedos je potrebné aktivovať WAPI a tiež vyplniť povolené IP adresy a heslo WAPI.

Klient LEGO podporuje stovky ďalších DNS poskytovateľov.
Ich zoznam nájdete na webe LEGO - zoznam podporovaných DNS poskytovateľov.

IP adresy VPS servera

curl -4 ifconfig.me
curl -6 ifconfig.me
Príkaz / hodnota Čo robí / čo nahradiť
curl -4 ifconfig.me Zobrazí verejnú IPv4 adresu servera, ktorú je potrebné povoliť vo VEDOS WAPI.
curl -6 ifconfig.me Zobrazí verejnú IPv6 adresu servera, ak ju VPS používa. Odporúča sa túto adresu povoliť aj vo VEDOS WAPI.

Do poľa Povolené IP adresy zadajte všetky odchádzajúce IP adresy vášho servera, zvyčajne IPv4 aj IPv6. Hodnoty sa oddeľujú medzerou. VEDOS povoľuje API požiadavky len z uvedených IP adries.
Dôležité: Ak povolíte len IPv4 a niektorá API požiadavka odíde cez IPv6, vydanie certifikátu môže prebehnúť úspešne, ale vyčistenie TXT záznamov zlyhá s chybou Access not allowed from this IP address.

Odporúčané hodnoty pre DNS poskytovateľa VEDOS

Pole Odporúčaná hodnota
Aktivovať WAPI Zapnuté
Povolené IP adresy Verejná IPv4 a prípadne IPv6 adresa VPS
Spôsob notifikácie POLL fronta
Preferovaný protokol JSON
Heslo Vygenerované heslo WAPI, nie bežné administračné heslo

Apache, webroot

Základné nastavenie Apache je podporná časť. DNS validácia prebieha cez DNS API, nie cez HTTP, ale Apache vhost je potrebný na poskytovanie webu po vydaní certifikátu.

›› Zobraziť/Skryť sekciu

Pred spustením nahraďte hodnotu example.com v riadku DOMAIN="example.com" svojou vlastnou doménou bez hviezdičky. Premenná $DOMAIN sa potom používa v nasledujúcich príkazoch pre cesty, Apache vhost a testovaciu 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
Príkaz / hodnota Čo robí / čo nahradiť
cd /var/www Prejde do adresára, kde sa zvyčajne ukladajú webové súbory.
apt update Aktualizuje zoznam balíkov.
apt install -y apache2 Nainštaluje Apache; -y automaticky potvrdí inštaláciu.
systemctl enable --now apache2 Povolí Apache pri štarte servera a zároveň ho spustí.
a2enmod rewrite headers ssl Povolí moduly pre presmerovania, hlavičky a HTTPS.
DOMAIN="example.com" Nastaví premennú domény. Nahraďte example.com svojou vlastnou doménou.
mkdir/chown/chmod/echo Vytvorí webroot, nastaví oprávnenia pre Apache a uloží jednoduchú testovaciu stránku.

HTTP vhost pre apex aj 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
Príkaz / hodnota Čo robí / čo nahradiť
cat > ... <<EOF Zapíše nový Apache HTTP vhost do súboru v sites-available.
ServerName $DOMAIN Hlavná doména virtuálneho hosta.
ServerAlias *.$DOMAIN Umožňuje obsluhu ľubovoľnej subdomény prvej úrovne.
DocumentRoot Adresár, z ktorého Apache poskytuje obsah.
a2ensite $DOMAIN.conf Povolí vhost.
apache2ctl configtest Overí syntax konfigurácie Apache.
curl -I http://$DOMAIN Overí HTTP odpoveď domény.

Konfiguračné súbory Lego

Odporúčaný prístup pre Lego v5 je uložiť nastavenia do konfiguračného súboru. Systemd služba tak nemusí obsahovať dlhý príkaz s doménami, DNS poskytovateľom a hookmi.

Konfiguračný súbor .env

Súbor .env je textový konfiguračný súbor, v ktorom sa ukladajú premenné prostredia, napríklad prístupové údaje, API kľúče alebo nastavenia aplikácie. Pre prehľadnosť môžete súbor pomenovať provider-domain.env. Súbor vedos-example.com.env bude obsahovať prihlasovacie údaje VEDOS WAPI, preto ho ukladáme do /etc/lego a nastavíme mu obmedzené oprávnenia.

DOMAIN="example.com"

mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
Príkaz / hodnota Čo robí / čo nahradiť
DOMAIN="example.com" Nastaví doménu pre nasledujúce príkazy. Nahraďte svojou vlastnou doménou.
mkdir -p /etc/lego/$DOMAIN Vytvorí adresár pre dáta a konfiguráciu Lego danej domény.
nano /etc/lego/vedos-$DOMAIN.env Otvorí súbor pre premenné VEDOS API.

V konfigurácii nižšie nahraďte WEDOS_LOGIN svojím prihlásením do VEDOS a WEDOS_WAPI_PASSWORD heslom vygenerovaným vo VEDOS WAPI. Hodnoty timeout a interval môžete ponechať tak, ako sú.

WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
Príkaz / hodnota Čo robí / čo nahradiť
WEDOS_USERNAME Prihlásenie do VEDOS účtu, ktorý spravuje DNS zónu.
WEDOS_WAPI_PASSWORD Heslo WAPI vygenerované v administrácii VEDOS.
WEDOS_PROPAGATION_TIMEOUT Maximálny čas čakania na propagáciu DNS v sekundách.
WEDOS_POLLING_INTERVAL Interval medzi kontrolami propagácie DNS.
WEDOS_TTL TTL TXT záznamov vytvorených pre ACME výzvu.
chmod 600 /etc/lego/vedos-$DOMAIN.env

Konfiguračný súbor lego.yml

Súbor .yml je textový konfiguračný súbor vo formáte YAML, ktorý sa používa na prehľadný zápis nastavení, parametrov a štruktúrovaných dát. Pred uložením YAML konfigurácie nahraďte example.com svojou vlastnou doménou, *.example.com wildcard názvom, vas@email.cz svojím kontaktným e-mailom a hodnoty KID / HMAC údajmi z vašej objednávky ACME certifikátu. Názvy ako certum-example alebo example-com-wildcard sú interné označenia; môžete ich ponechať, ale pri viacerých doménach je vhodné premenovať ich podľa domény.

mkdir /etc/lego/$DOMAIN
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: vedos
      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
Príkaz / hodnota Čo robí / čo nahradiť
storage Adresár pre účet Lego, certifikáty a metadáta.
accounts Definícia ACME účtu vrátane e-mailu a EAB údajov.
servers.certum.url Certum ACME endpoint.
challenges.vedos-dns DNS-01 validácia cez poskytovateľa VEDOS.
envFile Súbor s prihlasovacími údajmi VEDOS API.
certificates Zoznam certifikátov, ktoré má Lego spravovať.
domains Apex doména a wildcard doména v certifikáte.
renew.days Koľko dní pred vypršaním platnosti má Lego obnoviť.
hooks.deploy.command Príkaz po úspešnom vydaní alebo obnove, tu znovunačítanie Apache.
chmod 600 /etc/lego/$DOMAIN/lego.yml

Súbor lego.yml obsahuje EAB HMAC, preto musí mať obmedzené oprávnenia. V zákazníckej dokumentácii používajte len zástupné hodnoty.

Vydanie certifikátu

Pred spustením nahraďte example.com v ceste doménou, ktorú ste použili pri vytváraní adresára. Prvé spustenie vytvorí ACME účet, nastaví DNS TXT záznamy cez DNS API, vykoná DNS-01 validáciu a uloží certifikát.

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

Počas čakania môže Lego vypísať:

dns01: waiting for record propagation timeout=1h0m0s interval=30s
Príkaz / hodnota Čo robí / čo nahradiť
lego --config Spustí Lego podľa konfiguračného súboru. Pri prvom spustení vydá certifikát, pri ďalších spusteniach rieši obnovu.
dns01: waiting for record propagation Lego vytvorilo TXT záznam a čaká, kým bude viditeľný v DNS.
timeout=1h0m0s Čaká najviac jednu hodinu.
interval=30s Kontroluje DNS každých 30 sekúnd.

To znamená, že Lego kontroluje DNS každých 30 sekúnd a čaká najviac 1 hodinu. Po úspechu overte súbory:

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

Adresár certificates/ obsahuje vydaný .crt, .key, intermediate certifikáty certifikačnej autority a metadáta.

Alternatívny CLI postup pre Lego v5

›› Zobraziť/Skryť sekciu

Ak nepoužívate konfiguračný súbor, v Lego v5 sa EAB zadáva počas registrácie účtu. Pred spustením nahraďte example.com svojou vlastnou doménou, vas@email.cz svojím vlastným e-mailom a KID / HMAC hodnotami z vašej 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'
Príkaz / hodnota Čo robí / čo nahradiť
lego accounts register Zaregistruje ACME účet ručne cez CLI bez lego.yml.
--path Adresár pre účet a certifikáty.
--server Certum ACME endpoint.
--email Kontaktný e-mail.
--accept-tos Súhlas s podmienkami služby.
--eab Povolí External Account Binding.
--eab.kid / --eab.hmac EAB údaje z CertManager.

Výpis účtov. V ceste použite opäť rovnakú doménu ako v predchádzajúcom príkaze:

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

Vydanie certifikátu teraz už bez EAB parametrov. Nahraďte example.com svojou vlastnou doménou a *.example.com wildcard názvom.

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'
Príkaz / hodnota Čo robí / čo nahradiť
set -a Automaticky exportuje premenné načítané zo súboru.
. /etc/lego/vedos-example.com.env Načíta premenné VEDOS API do aktuálneho shellu.
set +a Vypne automatický export premenných.
lego run Vydá alebo obnoví certifikát bez konfiguračného súboru.
--dns vedos Použije DNS API.
--domains Domény, ktoré budú v certifikáte.

Nasadenie certifikátu do Apache

Pred vytvorením HTTPS vhost nahraďte example.com svojou vlastnou doménou v názve súboru, hodnotách ServerName a ServerAlias, cestách k webroot a cestách k certifikátu. Tieto cesty musia zodpovedať doméne použitej v konfigurácii Lego.


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
Príkaz / hodnota Čo robí / čo nahradiť
cat > ...-le-ssl.conf Vytvorí Apache HTTPS vhost.
ServerName / ServerAlias Určuje apex doménu a wildcard subdomény.
SSLCertificateFile Cesta k certifikátu od Lego.
SSLCertificateKeyFile Cesta k súkromnému kľúču od Lego.
a2ensite Povolí HTTPS vhost.
systemctl reload apache2 Znovu načíta novú konfiguráciu Apache.
curl -I https://... Overí HTTPS odpoveď.

Automatická obnova

Lego dokáže certifikát obnoviť, ale po inštalácii si nevytvorí systemd časovač samo. Pravidelné spúšťanie sa nastaví cez vlastnú službu a časovač. Pred vložením nahraďte example-com v názve služby/časovača svojím vlastným bezpečným názvom bez bodiek, napríklad mojedomena-cz, a nahraďte example.com v ceste ku konfigurácii svojou vlastnou 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
Príkaz / hodnota Čo robí / čo nahradiť
lego-example-com-renew.service Systemd služba pre jednorazové spustenie Lego renew/run.
Type=oneshot Služba sa spustí, vykoná svoju prácu a skončí.
ExecStart Spustí Lego podľa lego.yml.
lego-example-com-renew.timer Systemd časovač, ktorý službu spúšťa pravidelne.
OnCalendar Čas dennej kontroly.
RandomizedDelaySec Náhodné oneskorenie, aby sa požiadavky nespustili všetky presne v rovnakom čase.
Persistent=true Spustí zmeškané vykonanie po štarte servera.
systemctl enable --now Povolí časovač a ihneď 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
Príkaz / hodnota Čo robí / čo nahradiť
systemctl start ...service Ručne spustí obnovovaciu službu na test.
journalctl -u ... Zobrazí najnovšie logy služby.

Ak certifikát nie je blízko vypršania platnosti, Lego môže oznámiť, že obnova nie je potrebná. Je to správne správanie.

Bežné chyby

Neznámy parameter v Lego

V Lego v5 sú EAB parametre --eab.kid a --eab.hmac. Parametre vždy patria ku konkrétnemu podpríkazu.

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

Vyčistenie TXT záznamov zlyhá na nepovolenej IP

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

Pridajte medzi povolené IP adresy vo VEDOS WAPI aj IPv6 adresu servera. Certifikát môže byť vydaný správne, ale TXT záznamy zostanú v DNS po validácii.

Kontrolný zoznam overenia

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
Príkaz / hodnota Čo robí / čo nahradiť
dig TXT Overí TXT záznamy v DNS.
lego --config Spustí konfiguráciu Lego.
systemctl status Zobrazí stav časovača.
apache2ctl configtest Overí konfiguráciu Apache.
curl -I Overí HTTPS odpoveď.

Späť na Nápovedu
Našli ste chybu alebo niečomu nerozumiete? Napíšte nám!

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