ACME klijent Lego - WildCard SSL
Detaljan vodič za postavljanje zvezdastog WildCard SSL sertifikata putem ACME klijenta Lego i API DNS validacije sa VEDOS veb hostingom. Postupak je namenjen za sertifikate tipa example.com i *.example.com, gde obnavljanje treba da bude automatsko bez ručnog unošenja TXT zapisa. Vodič koristi ACME sertifikat od sertifikacionog tela Certum. Korišćeni sertifikat služi samo kao primer – princip rada i postupak ACME postavljanja su isti za sva sertifikaciona tela.
Vodič koristi sintaksu proverenu na Lego 5.2.2. Lego v5 je promenio neke parametre u odnosu na starije verzije, pa u slučaju greške poput flag provided but not defined proverite ispravnu sintaksu pomoću lego accounts register --help, lego run --help ili lego --help.
Sadržaj članka
- Instalacija Lego
- DNS API provajder
- Lego konfiguracioni fajlovi
- Izdavanje sertifikata
- Postavljanje na Apache
- Automatsko obnavljanje
- Česte greške
Osnovni pojmovi
- ACME – protokol za automatizovano izdavanje i obnavljanje SSL/TLS sertifikata.
- Lego – ACME klijent napisan u Go. Može izvršavati DNS validaciju kroz mnoge DNS provajdere (lista podržanih DNS provajdera).
- DNS-01 – validacija putem DNS TXT zapisa
_acme-challenge. Neophodna je za WildCard sertifikate. - EAB kid + hmac – External Account Binding (EAB) podaci od sertifikacionog tela. Oni povezuju Certbot sa nalogom ili proizvodom.
- VEDOS WAPI – VEDOS API interfejs preko kojeg Lego kreira i briše DNS TXT zapise.
- Systemd service - konfiguracioni fajl koji govori Linux sistemu kako da pokrene aplikaciju i održi je u radu čak i nakon ponovnog pokretanja servera.
U svim prikazanim primerima zamenite domen example.com sopstvenim domenom.
Instalacija 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
Nakon uspešne instalacije, preporučujemo uklanjanje privremenih fajlova.
rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
apt update |
Ažurira listu paketa. |
apt install -y curl tar |
Instalira alate za preuzimanje i raspakivanje Lego. |
LEGO_URL=... |
Pronalazi URL najnovijeg Linux amd64 release paketa. |
curl -L -o lego.tar.gz |
Preuzima Lego arhivu. |
tar -xzf lego.tar.gz |
Raspakuje arhivu. |
install -m 0755 lego /usr/local/bin/lego |
Instalira Lego kao izvršnu sistemsku komandu. |
lego --version |
Proverava instaliranu verziju Lego. |
DNS API provajder
Ovaj vodič koristi DNS API od registra domena Vedos, koji nudi API za upravljanje DNS-om registrovanih domena. Za Vedos veb hosting, potrebno je da aktivirate WAPI i takođe popunite dozvoljene IP adrese i WAPI lozinku.
LEGO klijent podržava stotine drugih DNS provajdera.
Njihovu listu možete pronaći na LEGO veb sajtu - lista podržanih DNS provajdera.
IP adrese VPS servera
curl -4 ifconfig.me
curl -6 ifconfig.me
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
curl -4 ifconfig.me |
Prikazuje javnu IPv4 adresu servera, koju je potrebno dozvoliti u VEDOS WAPI. |
curl -6 ifconfig.me |
Prikazuje javnu IPv6 adresu servera, ako je VPS koristi. Preporučljivo je dozvoliti i ovu adresu u VEDOS WAPI. |
U polje Dozvoljene IP adrese unesite sve izlazne IP adrese vašeg servera, obično i IPv4 i IPv6. Vrednosti se razdvajaju razmakom. VEDOS dozvoljava API zahteve samo sa navedenih IP adresa.
Važno: Ako dozvolite samo IPv4, a neki API zahtev izađe putem IPv6, izdavanje sertifikata može uspeti, ali čišćenje TXT zapisa neće uspeti sa greškom Access not allowed from this IP address.
Preporučene vrednosti za VEDOS DNS provajder
| Polje | Preporučena vrednost |
|---|---|
| Aktivirati WAPI | Uključeno |
| Dozvoljene IP adrese | Javna IPv4 i eventualno IPv6 adresa VPS-a |
| Metoda obaveštavanja | POLL red |
| Preferirani protokol | JSON |
| Lozinka | Generisana WAPI lozinka, ne obična administratorska lozinka |
Apache, webroot
Osnovno podešavanje Apache je pomoćni deo. DNS validacija se odvija kroz DNS API, ne putem HTTP, ali je Apache vhost potreban za serviranje veb sajta nakon izdavanja sertifikata.
›› Prikaži/Sakrij sekcijuPre pokretanja, zamenite vrednost example.com u liniji DOMAIN="example.com" sopstvenim domenom bez zvezdice. Promenljiva $DOMAIN se zatim koristi u sledećim komandama za putanje, Apache vhost i test 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
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
cd /var/www |
Prelazi u direktorijum gde se obično čuvaju veb fajlovi. |
apt update |
Ažurira listu paketa. |
apt install -y apache2 |
Instalira Apache; -y automatski potvrđuje instalaciju. |
systemctl enable --now apache2 |
Omogućava Apache pri pokretanju servera i istovremeno ga pokreće. |
a2enmod rewrite headers ssl |
Omogućava module za preusmeravanja, zaglavlja i HTTPS. |
DOMAIN="example.com" |
Postavlja promenljivu domena. Zamenite example.com sopstvenim domenom. |
mkdir/chown/chmod/echo |
Kreira webroot, postavlja dozvole za Apache i čuva jednostavnu test 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
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
cat > ... <<EOF |
Zapisuje novi Apache HTTP vhost u fajl u sites-available. |
ServerName $DOMAIN |
Glavni domen virtuelnog hosta. |
ServerAlias *.$DOMAIN |
Omogućava obradu bilo kog poddomena prvog nivoa. |
DocumentRoot |
Direktorijum iz kojeg Apache servira sadržaj. |
a2ensite $DOMAIN.conf |
Omogućava vhost. |
apache2ctl configtest |
Proverava sintaksu Apache konfiguracije. |
curl -I http://$DOMAIN |
Proverava HTTP odgovor domena. |
Lego konfiguracioni fajlovi
Preporučeni pristup za Lego v5 je čuvanje podešavanja u konfiguracionom fajlu. Systemd service tada ne mora da sadrži dugu komandu sa domenima, DNS provajderom i hukovima.
Konfiguracioni fajl .env
Fajl .env je tekstualni konfiguracioni fajl u kojem se čuvaju promenljive okruženja, na primer akreditivi za pristup, API ključevi ili podešavanja aplikacije. Radi preglednosti, fajl možete nazvati provider-domain.env. Fajl vedos-example.com.env će sadržati VEDOS WAPI akreditive za prijavu, pa ga čuvamo u /etc/lego i postavljamo mu ograničene dozvole.
DOMAIN="example.com"
mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
DOMAIN="example.com" |
Postavlja domen za sledeće komande. Zamenite sopstvenim domenom. |
mkdir -p /etc/lego/$DOMAIN |
Kreira direktorijum za Lego podatke i konfiguraciju datog domena. |
nano /etc/lego/vedos-$DOMAIN.env |
Otvara fajl za VEDOS API promenljive. |
U konfiguraciji ispod, zamenite WEDOS_LOGIN vašim VEDOS loginom, a WEDOS_WAPI_PASSWORD lozinkom generisanom u VEDOS WAPI. Vrednosti 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
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
WEDOS_USERNAME |
VEDOS login naloga koji upravlja DNS zonom. |
WEDOS_WAPI_PASSWORD |
WAPI lozinka generisana u VEDOS administraciji. |
WEDOS_PROPAGATION_TIMEOUT |
Maksimalno vreme čekanja na DNS propagaciju u sekundama. |
WEDOS_POLLING_INTERVAL |
Interval između provera DNS propagacije. |
WEDOS_TTL |
TTL TXT zapisa kreiranih za ACME izazov. |
chmod 600 /etc/lego/vedos-$DOMAIN.env
Konfiguracioni fajl lego.yml
Fajl .yml je tekstualni konfiguracioni fajl u YAML formatu, koji se koristi za pregledan zapis podešavanja, parametara i strukturiranih podataka. Pre čuvanja YAML konfiguracije, zamenite example.com sopstvenim domenom, *.example.com wildcard imenom, vas@email.cz vašim kontakt e-mailom, a vrednosti KID / HMAC podacima iz vaše porudžbine ACME sertifikata. Imena poput certum-example ili example-com-wildcard su interne oznake; možete ih ostaviti, ali kod više domena je preporučljivo preimenovati ih prema domenu.
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
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
storage |
Direktorijum za Lego nalog, sertifikate i metapodatke. |
accounts |
Definicija ACME naloga uključujući e-mail i EAB podatke. |
servers.certum.url |
Certum ACME endpoint. |
challenges.vedos-dns |
DNS-01 validacija kroz VEDOS provajder. |
envFile |
Fajl sa VEDOS API akreditivima za prijavu. |
certificates |
Lista sertifikata kojima Lego treba da upravlja. |
domains |
Apex domen i wildcard domen u sertifikatu. |
renew.days |
Koliko dana pre isteka Lego treba da obnovi. |
hooks.deploy.command |
Komanda nakon uspešnog izdavanja ili obnavljanja, ovde ponovno učitavanje Apache. |
chmod 600 /etc/lego/$DOMAIN/lego.yml
Fajl lego.yml sadrži EAB HMAC, pa mora imati ograničene dozvole. U dokumentaciji za klijente koristite samo čuvare mesta.
Izdavanje sertifikata
Pre pokretanja, zamenite example.com u putanji domenom koji ste koristili pri kreiranju direktorijuma. Prvo pokretanje kreira ACME nalog, postavlja DNS TXT zapise kroz DNS API, izvršava DNS-01 validaciju i čuva sertifikat.
lego --config /etc/lego/$DOMAIN/lego.yml
Tokom čekanja, Lego može ispisati:
dns01: waiting for record propagation timeout=1h0m0s interval=30s
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
lego --config |
Pokreće Lego prema konfiguracionom fajlu. Pri prvom pokretanju izdaje sertifikat, pri narednim pokretanjima obavlja obnavljanje. |
dns01: waiting for record propagation |
Lego je kreirao TXT zapis i čeka dok ne bude vidljiv u DNS-u. |
timeout=1h0m0s |
Čeka najviše jedan sat. |
interval=30s |
Proverava DNS svakih 30 sekundi. |
To znači da Lego proverava DNS svakih 30 sekundi i čeka najviše 1 sat. Nakon uspeha, proverite fajlove:
ls -la /etc/lego/$DOMAIN/certificates/
Direktorijum certificates/ sadrži izdate .crt, .key, intermediate sertifikate sertifikacionog tela i metapodatke.
Alternativni CLI postupak za Lego v5
›› Prikaži/Sakrij sekcijuAko ne koristite konfiguracioni fajl, u Lego v5 se EAB unosi tokom registracije naloga. Pre pokretanja, zamenite example.com sopstvenim domenom, vas@email.cz sopstvenim e-mailom, a KID / HMAC vrednostima iz vaše porudžbine.
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'
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
lego accounts register |
Registruje ACME nalog ručno putem CLI bez lego.yml. |
--path |
Direktorijum za nalog i sertifikate. |
--server |
Certum ACME endpoint. |
--email |
Kontakt e-mail. |
--accept-tos |
Saglasnost sa uslovima korišćenja. |
--eab |
Omogućava External Account Binding. |
--eab.kid / --eab.hmac |
EAB podaci iz CertManager-a. |
Listanje naloga. U putanji ponovo koristite isti domen kao u prethodnoj komandi:
lego accounts list --path /etc/lego/example.com
Izdavanje sertifikata sada bez EAB parametara. Zamenite example.com sopstvenim domenom, a *.example.com wildcard imenom.
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'
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
set -a |
Automatski eksportuje promenljive učitane iz fajla. |
. /etc/lego/vedos-example.com.env |
Učitava VEDOS API promenljive u trenutni shell. |
set +a |
Isključuje automatski eksport promenljivih. |
lego run |
Izdaje ili obnavlja sertifikat bez konfiguracionog fajla. |
--dns vedos |
Koristi DNS API. |
--domains |
Domeni koji će biti u sertifikatu. |
Postavljanje sertifikata na Apache
Pre kreiranja HTTPS vhost-a, zamenite example.com sopstvenim domenom u imenu fajla, vrednostima ServerName i ServerAlias, putanjama do webroot-a i putanjama do sertifikata. Ove putanje moraju odgovarati domenu korišćenom 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
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
cat > ...-le-ssl.conf |
Kreira Apache HTTPS vhost. |
ServerName / ServerAlias |
Navodi apex domen i wildcard poddomene. |
SSLCertificateFile |
Putanja do sertifikata iz Lego. |
SSLCertificateKeyFile |
Putanja do privatnog ključa iz Lego. |
a2ensite |
Omogućava HTTPS vhost. |
systemctl reload apache2 |
Ponovo učitava novu Apache konfiguraciju. |
curl -I https://... |
Proverava HTTPS odgovor. |
Automatsko obnavljanje
Lego može obnoviti sertifikat, ali nakon instalacije ne kreira sam systemd tajmer. Redovno izvršavanje se podešava putem prilagođenog servisa i tajmera. Pre umetanja, zamenite example-com u imenu servisa/tajmera sopstvenim bezbednim imenom bez tačaka, na primer mojedomena-cz, i zamenite example.com u putanji konfiguracije sopstvenim 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
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
lego-example-com-renew.service |
Systemd service za jednokratno pokretanje Lego renew/run. |
Type=oneshot |
Servis se pokreće, obavi svoj posao i završi. |
ExecStart |
Pokreće Lego prema lego.yml. |
lego-example-com-renew.timer |
Systemd tajmer koji redovno pokreće servis. |
OnCalendar |
Vreme svakodnevne provere. |
RandomizedDelaySec |
Nasumično kašnjenje kako se zahtevi ne bi svi pokrenuli u potpuno isto vreme. |
Persistent=true |
Pokreće propušteno izvršavanje nakon pokretanja servera. |
systemctl enable --now |
Omogućava tajmer i odmah ga aktivira. |
Bezbedan test servisa:
systemctl start lego-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
systemctl start ...service |
Ručno pokreće servis za obnavljanje radi testa. |
journalctl -u ... |
Prikazuje najnovije logove servisa. |
Ako sertifikat nije blizu isteka, Lego može prijaviti da obnavljanje nije potrebno. Ovo je ispravno ponašanje.
Česte greške
Nepoznat parametar u Lego
U Lego v5 EAB parametri su --eab.kid i --eab.hmac. Parametri uvek pripadaju određenoj podkomandi.
lego accounts register --help
lego accounts list --help
lego run --help
Čišćenje TXT zapisa ne uspeva na nedozvoljenoj IP adresi
Cleaning up failed ... Access not allowed from this IP address (2a02:...)
Dodajte i IPv6 adresu servera u dozvoljene IP adrese u VEDOS WAPI. Sertifikat može biti ispravno izdat, ali će TXT zapisi ostati u DNS-u nakon validacije.
Kontrolna lista za proveru
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
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
dig TXT |
Proverava TXT zapise u DNS-u. |
lego --config |
Pokreće Lego konfiguraciju. |
systemctl status |
Prikazuje status tajmera. |
apache2ctl configtest |
Proverava Apache konfiguraciju. |
curl -I |
Proverava HTTPS odgovor. |
Kuda dalje?
Nazad na Pomoć
Pronašli ste grešku ili vam nešto nije jasno? Pišite nam!
