SSLmentor

Kvalitetni TLS/SSL certifikati za web stranice i internet projekte.

Lego & ACME WildCard

Lego & ACME WildCard

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.

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 odjeljak

Prije 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 odjeljak

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

Povratak na pomoć
Našli ste grešku ili ne razumete nešto? Pišite nam!

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