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.
Obsah článku
- Instalace Lego
- Webhosting DNS API
- Konfigurační soubor Lego
- Vydání certifikátu
- Nasazení do Apache
- Automatická obnova
- Časté chyby
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 sekciPř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 sekciPokud 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ěď. |
Kam dál?
Zpět na Nápovědu
Našli jste chybu nebo něčemu nerozumíte? Napište nám!
