ACME klijent Lego - WildCard SSL
Detaljan vodič za implementaciju zvjezdastog WildCard SSL certifikata putem ACME klijenta Lego i API DNS validacije s VEDOS web hostingom. Postupak je namijenjen za certifikate tipa example.com i *.example.com, gdje bi obnavljanje trebalo biti automatsko bez ručnog unosa TXT zapisa. Vodič koristi ACME certifikat od certifikacijskog tijela Certum. Korišteni certifikat služi samo kao primjer – načelo rada i postupak ACME implementacije jednaki su za sva certifikacijska tijela.
Vodič koristi sintaksu provjerenu na Lego 5.2.2. Lego v5 promijenio je neke parametre u odnosu na starije verzije, pa u slučaju pogreške poput flag provided but not defined provjerite ispravnu sintaksu pomoću lego accounts register --help, lego run --help ili lego --help.
Sadržaj članka
- Instalacija Lega
- DNS API pružatelj
- Lego konfiguracijske datoteke
- Izdavanje certifikata
- Implementacija na Apache
- Automatsko obnavljanje
- Uobičajene pogreške
Osnovni pojmovi
- ACME – protokol za automatizirano izdavanje i obnavljanje SSL/TLS certifikata.
- Lego – ACME klijent napisan u Go. Može provoditi DNS validaciju putem mnogih DNS pružatelja (popis podržanih DNS pružatelja).
- DNS-01 – validacija putem DNS TXT zapisa
_acme-challenge. Potrebna je za WildCard certifikate. - EAB kid + hmac – External Account Binding (EAB) podaci od certifikacijskog tijela. Povezuju Certbot s računom ili proizvodom.
- VEDOS WAPI – VEDOS API sučelje putem kojeg Lego stvara i briše DNS TXT zapise.
- Systemd service - konfiguracijska datoteka koja Linux sustavu govori kako pokrenuti aplikaciju i održavati je pokrenutom čak i nakon ponovnog pokretanja poslužitelja.
U svim prikazanim primjerima zamijenite domenu example.com svojom vlastitom domenom.
Instalacija Lega
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
Nakon uspješne instalacije preporučujemo uklanjanje privremenih datoteka.
rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
apt update |
Ažurira popis paketa. |
apt install -y curl tar |
Instalira alate za preuzimanje i raspakiravanje Lega. |
LEGO_URL=... |
Pronalazi URL najnovijeg Linux amd64 release paketa. |
curl -L -o lego.tar.gz |
Preuzima Lego arhivu. |
tar -xzf lego.tar.gz |
Raspakira arhivu. |
install -m 0755 lego /usr/local/bin/lego |
Instalira Lego kao izvršnu sistemsku naredbu. |
lego --version |
Provjerava instaliranu verziju Lega. |
DNS API pružatelj
Ovaj vodič koristi DNS API registrara domena Vedos, koji nudi API za upravljanje DNS-om registriranih domena. Za Vedos web hosting potrebno je aktivirati WAPI te također ispuniti dopuštene IP adrese i WAPI lozinku.
Klijent LEGO podržava stotine drugih DNS pružatelja.
Njihov popis možete pronaći na LEGO web stranici - popis podržanih DNS pružatelja.
IP adrese VPS poslužitelja
curl -4 ifconfig.me
curl -6 ifconfig.me
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
curl -4 ifconfig.me |
Prikazuje javnu IPv4 adresu poslužitelja, koju je potrebno dopustiti u VEDOS WAPI. |
curl -6 ifconfig.me |
Prikazuje javnu IPv6 adresu poslužitelja, ako je VPS koristi. Preporučljivo je dopustiti i ovu adresu u VEDOS WAPI. |
U polje Dopuštene IP adrese unesite sve izlazne IP adrese svog poslužitelja, obično i IPv4 i IPv6. Vrijednosti se odvajaju razmakom. VEDOS dopušta API zahtjeve samo s navedenih IP adresa.
Važno: Ako dopustite samo IPv4, a neki API zahtjev izađe putem IPv6, izdavanje certifikata može uspjeti, ali čišćenje TXT zapisa neće uspjeti uz pogrešku Access not allowed from this IP address.
Preporučene vrijednosti za VEDOS DNS pružatelja
| Polje | Preporučena vrijednost |
|---|---|
| Aktivirati WAPI | Uključeno |
| Dopuštene IP adrese | Javna IPv4 i eventualno IPv6 adresa VPS-a |
| Način obavještavanja | POLL queue |
| Preferirani protokol | JSON |
| Lozinka | Generirana WAPI lozinka, a ne uobičajena administratorska lozinka |
Apache, webroot
Osnovno postavljanje Apachea pomoćni je dio. DNS validacija radi putem DNS API-ja, a ne putem HTTP-a, ali Apache vhost potreban je za posluživanje web stranice nakon izdavanja certifikata.
›› Prikaži/Sakrij odjeljakPrije pokretanja zamijenite vrijednost example.com u retku DOMAIN="example.com" svojom vlastitom domenom bez zvjezdice. Varijabla $DOMAIN zatim se koristi u sljedećim naredbama za putanje, Apache vhost i testnu stranicu.
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
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
cd /var/www |
Prelazi u direktorij u kojem se obično pohranjuju web datoteke. |
apt update |
Ažurira popis paketa. |
apt install -y apache2 |
Instalira Apache; -y automatski potvrđuje instalaciju. |
systemctl enable --now apache2 |
Omogućuje Apache pri pokretanju poslužitelja i istovremeno ga pokreće. |
a2enmod rewrite headers ssl |
Omogućuje module za preusmjeravanja, zaglavlja i HTTPS. |
DOMAIN="example.com" |
Postavlja varijablu domene. Zamijenite example.com svojom vlastitom domenom. |
mkdir/chown/chmod/echo |
Stvara webroot, postavlja dozvole za Apache i sprema jednostavnu testnu stranicu. |
HTTP vhost za apex i poddomene:
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
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
cat > ... <<EOF |
Zapisuje novi Apache HTTP vhost u datoteku u sites-available. |
ServerName $DOMAIN |
Glavna domena virtualnog hosta. |
ServerAlias *.$DOMAIN |
Omogućuje obradu bilo koje poddomene prve razine. |
DocumentRoot |
Direktorij iz kojeg Apache poslužuje sadržaj. |
a2ensite $DOMAIN.conf |
Omogućuje vhost. |
apache2ctl configtest |
Provjerava sintaksu Apache konfiguracije. |
curl -I http://$DOMAIN |
Provjerava HTTP odgovor domene. |
Lego konfiguracijske datoteke
Preporučeni pristup za Lego v5 jest pohranjivanje postavki u konfiguracijsku datoteku. Systemd service tada ne mora sadržavati dugu naredbu s domenama, DNS pružateljem i hookovima.
Konfiguracijska datoteka .env
Datoteka .env je tekstualna konfiguracijska datoteka u kojoj se pohranjuju varijable okruženja, primjerice pristupne vjerodajnice, API ključevi ili postavke aplikacije. Radi preglednosti datoteku možete nazvati provider-domain.env. Datoteka vedos-example.com.env sadržavat će VEDOS WAPI vjerodajnice za prijavu, pa je pohranjujemo u /etc/lego i postavljamo joj ograničene dozvole.
DOMAIN="example.com"
mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
DOMAIN="example.com" |
Postavlja domenu za sljedeće naredbe. Zamijenite svojom vlastitom domenom. |
mkdir -p /etc/lego/$DOMAIN |
Stvara direktorij za Lego podatke i konfiguraciju zadane domene. |
nano /etc/lego/vedos-$DOMAIN.env |
Otvara datoteku za VEDOS API varijable. |
U konfiguraciji ispod zamijenite WEDOS_LOGIN svojom VEDOS prijavom i WEDOS_WAPI_PASSWORD lozinkom generiranom u VEDOS WAPI. Vrijednosti timeout i interval možete ostaviti kakve jesu.
WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
WEDOS_USERNAME |
VEDOS prijava računa koji upravlja DNS zonom. |
WEDOS_WAPI_PASSWORD |
WAPI lozinka generirana u VEDOS administraciji. |
WEDOS_PROPAGATION_TIMEOUT |
Maksimalno vrijeme čekanja na DNS propagaciju u sekundama. |
WEDOS_POLLING_INTERVAL |
Interval između provjera DNS propagacije. |
WEDOS_TTL |
TTL TXT zapisa stvorenih za ACME izazov. |
chmod 600 /etc/lego/vedos-$DOMAIN.env
Konfiguracijska datoteka lego.yml
Datoteka .yml je tekstualna konfiguracijska datoteka u YAML formatu, koja se koristi za pregledan zapis postavki, parametara i strukturiranih podataka. Prije spremanja YAML konfiguracije zamijenite example.com svojom vlastitom domenom, *.example.com wildcard nazivom, vas@email.cz svojim kontakt e-mailom te vrijednosti KID / HMAC podacima iz vaše narudžbe ACME certifikata. Nazivi poput certum-example ili example-com-wildcard interne su oznake; možete ih ostaviti, ali kod više domena preporučljivo ih je preimenovati prema domeni.
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
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
storage |
Direktorij za Lego račun, certifikate i metapodatke. |
accounts |
Definicija ACME računa uključujući e-mail i EAB podatke. |
servers.certum.url |
Certum ACME krajnja točka. |
challenges.vedos-dns |
DNS-01 validacija putem VEDOS pružatelja. |
envFile |
Datoteka s VEDOS API vjerodajnicama za prijavu. |
certificates |
Popis certifikata kojima bi Lego trebao upravljati. |
domains |
Apex domena i wildcard domena u certifikatu. |
renew.days |
Koliko dana prije isteka bi Lego trebao obnoviti. |
hooks.deploy.command |
Naredba nakon uspješnog izdavanja ili obnavljanja, ovdje ponovno učitavanje Apachea. |
chmod 600 /etc/lego/$DOMAIN/lego.yml
Datoteka lego.yml sadrži EAB HMAC, pa mora imati ograničene dozvole. U dokumentaciji za kupce koristite samo rezervirana mjesta.
Izdavanje certifikata
Prije pokretanja zamijenite example.com u putanji domenom koju ste koristili pri stvaranju direktorija. Prvo pokretanje stvara ACME račun, postavlja DNS TXT zapise putem DNS API-ja, provodi DNS-01 validaciju i sprema certifikat.
lego --config /etc/lego/$DOMAIN/lego.yml
Tijekom čekanja Lego može ispisati:
dns01: waiting for record propagation timeout=1h0m0s interval=30s
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
lego --config |
Pokreće Lego prema konfiguracijskoj datoteci. Pri prvom pokretanju izdaje certifikat, pri sljedećim pokretanjima obrađuje obnavljanje. |
dns01: waiting for record propagation |
Lego je stvorio TXT zapis i čeka dok ne postane vidljiv u DNS-u. |
timeout=1h0m0s |
Čeka najviše jedan sat. |
interval=30s |
Provjerava DNS svakih 30 sekundi. |
To znači da Lego provjerava DNS svakih 30 sekundi i čeka najviše 1 sat. Nakon uspjeha provjerite datoteke:
ls -la /etc/lego/$DOMAIN/certificates/
Direktorij certificates/ sadrži izdani .crt, .key, intermediate certifikate certifikacijskog tijela i metapodatke.
Alternativni CLI postupak za Lego v5
›› Prikaži/Sakrij odjeljakAko ne koristite konfiguracijsku datoteku, u Lego v5 EAB se unosi tijekom registracije računa. Prije pokretanja zamijenite example.com svojom vlastitom domenom, vas@email.cz svojim vlastitim e-mailom i KID / HMAC vrijednostima iz vaše narudžbe.
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'
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
lego accounts register |
Registrira ACME račun ručno putem CLI-ja bez lego.yml. |
--path |
Direktorij za račun i certifikate. |
--server |
Certum ACME krajnja točka. |
--email |
Kontakt e-mail. |
--accept-tos |
Suglasnost s uvjetima usluge. |
--eab |
Omogućuje External Account Binding. |
--eab.kid / --eab.hmac |
EAB podaci iz CertManagera. |
Popis računa. U putanji ponovno koristite istu domenu kao u prethodnoj naredbi:
lego accounts list --path /etc/lego/example.com
Izdavanje certifikata sada bez EAB parametara. Zamijenite example.com svojom vlastitom domenom i *.example.com wildcard nazivom.
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'
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
set -a |
Automatski izvozi varijable učitane iz datoteke. |
. /etc/lego/vedos-example.com.env |
Učitava VEDOS API varijable u trenutni shell. |
set +a |
Isključuje automatski izvoz varijabli. |
lego run |
Izdaje ili obnavlja certifikat bez konfiguracijske datoteke. |
--dns vedos |
Koristi DNS API. |
--domains |
Domene koje će biti u certifikatu. |
Implementacija certifikata na Apache
Prije stvaranja HTTPS vhosta zamijenite example.com svojom vlastitom domenom u nazivu datoteke, vrijednostima ServerName i ServerAlias, putanjama webroota i putanjama certifikata. Te putanje moraju odgovarati domeni korištenoj u Lego konfiguraciji.
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
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
cat > ...-le-ssl.conf |
Stvara Apache HTTPS vhost. |
ServerName / ServerAlias |
Određuje apex domenu i wildcard poddomene. |
SSLCertificateFile |
Putanja do certifikata iz Lega. |
SSLCertificateKeyFile |
Putanja do privatnog ključa iz Lega. |
a2ensite |
Omogućuje HTTPS vhost. |
systemctl reload apache2 |
Ponovno učitava novu Apache konfiguraciju. |
curl -I https://... |
Provjerava HTTPS odgovor. |
Automatsko obnavljanje
Lego može obnoviti certifikat, ali nakon instalacije sam ne stvara systemd timer. Redovito izvršavanje postavlja se putem prilagođene usluge i timera. Prije umetanja zamijenite example-com u nazivu service/timer svojim vlastitim sigurnim nazivom bez točaka, primjerice mojedomena-cz, i zamijenite example.com u putanji konfiguracije svojom vlastitom domenom.
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
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
lego-example-com-renew.service |
Systemd service za jednokratno pokretanje Lego renew/run. |
Type=oneshot |
Usluga se pokrene, obavi svoj posao i završi. |
ExecStart |
Pokreće Lego prema lego.yml. |
lego-example-com-renew.timer |
Systemd timer koji redovito pokreće uslugu. |
OnCalendar |
Vrijeme svakodnevne provjere. |
RandomizedDelaySec |
Nasumična odgoda kako se zahtjevi ne bi svi pokrenuli točno u isto vrijeme. |
Persistent=true |
Pokreće propušteno izvršavanje nakon pokretanja poslužitelja. |
systemctl enable --now |
Omogućuje timer i odmah ga aktivira. |
Siguran test usluge:
systemctl start lego-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
systemctl start ...service |
Ručno pokreće uslugu obnavljanja za test. |
journalctl -u ... |
Prikazuje najnovije zapisnike usluge. |
Ako certifikat nije blizu isteka, Lego može javiti da obnavljanje nije potrebno. To je ispravno ponašanje.
Uobičajene pogreške
Nepoznat parametar u Legu
U Lego v5 EAB parametri su --eab.kid i --eab.hmac. Parametri uvijek pripadaju određenoj podnaredbi.
lego accounts register --help
lego accounts list --help
lego run --help
Čišćenje TXT zapisa ne uspijeva na nedopuštenom IP-u
Cleaning up failed ... Access not allowed from this IP address (2a02:...)
Dodajte i IPv6 adresu poslužitelja u dopuštene IP adrese u VEDOS WAPI. Certifikat može biti ispravno izdan, ali TXT zapisi ostat će u DNS-u nakon validacije.
Kontrolni popis za provjeru
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
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
dig TXT |
Provjerava TXT zapise u DNS-u. |
lego --config |
Pokreće Lego konfiguraciju. |
systemctl status |
Prikazuje status timera. |
apache2ctl configtest |
Provjerava Apache konfiguraciju. |
curl -I |
Provjerava HTTPS odgovor. |
Kamo dalje?
Povratak na pomoć
Našli ste grešku ili ne razumete nešto? Pišite nam!
