SSLmentor

Kvalitetni TLS/SSL sertifikati za veb stranice i internet projekte.

Lego & ACME WildCard

Lego & ACME WildCard

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.

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 sekciju

Pre 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 sekciju

Ako 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.

Nazad na Pomoć
Pronašli ste grešku ili vam nešto nije jasno? Pišite nam!

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