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.
Obsah článku
- Inštalácia Lego
- Poskytovateľ DNS API
- Konfiguračné súbory Lego
- Vydanie certifikátu
- Nasadenie do Apache
- Automatická obnova
- Bežné chyby
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ť sekciuPred 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ť sekciuAk 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ď. |
Kam ďalej?
Späť na Nápovedu
Našli ste chybu alebo niečomu nerozumiete? Napíšte nám!
