ACME klijent Lego
ACME klijent Lego neovisan je, besplatan projekt otvorenog koda napisan u jeziku Go. Idealan je za prilagođenu integraciju i skriptiranje i uživa široku podršku registrara domena i DNS pružatelja. Lego je fleksibilan ACME klijent koji se lako integrira u prilagođene sustave i skripte. Osim HTTP-01 validacije, nudi DNS validaciju putem mnogih DNS pružatelja (popis podržanih DNS pružatelja) za dobivanje WildCard SSL certifikata.
Vodič koristi sintaksu provjerenu na verziji Lego 5.*.* i namijenjen je za Debian/Ubuntu s Apacheom 2 i ACME klijentom Lego.
Sadržaj članka
- Instalacija Lega
- Apache, webroot
- Lego konfiguracijske datoteke
- Izdavanje certifikata
- Implementacija na Apache
- Automatsko obnavljanje
Osnovni pojmovi
- ACME – protokol za automatizirano izdavanje i obnavljanje SSL/TLS certifikata.
- HTTP-01 – ACME metoda validacije koja provjerava vlasništvo nad domenom pomoću privremene datoteke dostupne putem HTTP-a.
- DNS-01 – metoda validacije putem DNS TXT zapisa
_acme-challenge. - EAB kid + hmac – External Account Binding (EAB) podaci od certifikacijskog tijela. Povezuju Certbot s računom ili proizvodom.
- Systemd service - konfiguracijska datoteka koja Linux sustavu govori kako pokrenuti aplikaciju i održavati je pokrenutom čak i nakon ponovnog pokretanja poslužitelja.
Ako se u primjerima pojavi domena example.com, uvijek je zamijenite 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. |
Apache, webroot
Ovaj postupak stvara osnovnu VirtualHost konfiguraciju za domenu na portu 80. Postavlja DocumentRoot, dozvole za web direktorij, stvara Apache zapisnike, omogućuje konfiguraciju pomoću a2ensite, provjerava njezinu ispravnost (apache2ctl configtest) i ponovno učitava promjene. Na kraju provjerava dostupnost web stranice pomoću HTTP zahtjeva curl.
Prije pokretanja zamijenite vrijednost example.com u retku DOMAIN="example.com" svojom vlastitom domenom. 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
# or just updates
apt update
apt install --only-upgrade apache2
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 poddomenu:
cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
ServerAlias www.$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"
curl -I "http://www.$DOMAIN"
Rezultat: Nakon otvaranja http://example.com trebala bi se pojaviti testna stranica.
| 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 www.$DOMAIN |
Stvara obradu za poddomenu 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 i hookovima.
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, vas@email.cz svojim kontakt e-mailom te vrijednosti KID / HMAC podacima iz vaše narudžbe ACME certifikata.
mkdir /etc/lego/$DOMAIN
nano /etc/lego/$DOMAIN/lego.yml
storage: /etc/lego/example.com
accounts:
certum-account:
server: certum
email: your@email.com # your email address for CA Certum
acceptsTermsOfService: true
eab:
kid: KID
hmacKey: HMAC
servers:
certum:
url: https://acme.certum.pl/directory
challenges:
http-chal:
http:
# Path to your website's document root.
# Lego will temporarily write a file to this directory .well-known/acme-challenge/
webroot: /var/www/example.com/public
certificates:
example-com:
account: certum-account
challenge: http-chal
domains:
- example.com
- www.example.com
renew:
days: 30
hooks:
deploy:
command: systemctl reload apache2
Savjet! Gotovo cjelovit YML sadržaj možete generirati izravno na poslužitelju, a zatim samo popuniti ispravan e-mail, kid i hmacKey. Samo pokrenite naredbu ispod i kopirajte sadržaj sa stranice index.html u datoteku lego.yml.
›› Prikaži/Sakrij pripremljeni YML.
cat > "/var/www/$DOMAIN/public/index.html" <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>${DOMAIN}</title>
<style>
body { font-family: sans-serif; max-width: 900px; margin: 40px auto; }
pre { background:#f4f4f4; padding:1em; overflow:auto; }
</style>
</head>
<body>
<h1>OK – ${DOMAIN}</h1>
<p>Apache is working correctly.</p>
<h2>lego.yml</h2>
<pre><code>storage: /etc/lego/${DOMAIN}
accounts:
certum-account:
server: certum
email: YOUR_EMAIL
acceptsTermsOfService: true
eab:
kid: YOUR_KID
hmacKey: YOUR_HMAC_KEY
servers:
certum:
url: https://acme.certum.pl/directory
challenges:
http-chal:
http:
webroot: /var/www/${DOMAIN}/public
certificates:
${DOMAIN//./-}:
account: certum-account
challenge: http-chal
domains:
- ${DOMAIN}
- www.${DOMAIN}
renew:
days: 30
hooks:
deploy:
command: systemctl reload apache2
</code></pre>
</body>
</html>
EOF
Datoteka lego.yml sadrži EAB HMAC, pa mora imati ograničene dozvole. U dokumentaciji koristite samo rezervirana mjesta.
chmod 600 /etc/lego/$DOMAIN/lego.yml
Provjera dozvola i vlasnika datoteke:
stat -c "%a %U:%G %n" /etc/lego/$DOMAIN/lego.yml
| 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.http-chal |
Validacija putem http-a. |
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. |
Izdavanje SSL/TLS certifikata
Prije pokretanja provjerite echo ${DOMAIN} ili postavite varijablu DOMAIN na naziv svoje domene DOMAIN="example.com". Alat Lego provodi HTTP-01 validaciju pomoću datoteke privremeno pohranjene u webrootu, provjerava vlasništvo nad domenom i zatim stvara SSL/TLS certifikat. Certifikat, privatni ključ i certifikat izdavatelja (intermediate) bit će pohranjeni u direktoriju /etc/lego/${DOMAIN}/certificates/.
lego --config /etc/lego/$DOMAIN/lego.yml
Tijekom generiranja ACME klijent Lego ispisat će informacije o zahtjevu:
root@vmiXXXXXXXX:~# echo ${DOMAIN}
example.com
root@:~# lego --config /etc/lego/$DOMAIN/lego.yml
INFO Archive account scope=accountID filepath=/etc/lego/example.com/accounts/acme.certum.pl/certum-acme/
archives=/etc/lego/example.com/archives/accounts/acme.certum.pl_certum-acme_1785270773.zip
INFO Private key saved. filepath=/etc/lego/example.com/accounts/acme.certum.pl/certum-account/certum-account.key
INFO Registering the account (EAB). email=your@email.com
WARN !!!! HEADS UP !!!!
Your account credentials have been saved in your
configuration directory at "/etc/lego/example.com/accounts".
You should make a secure backup of this folder now. This
configuration directory will also contain private keys
generated by lego and certificates obtained from the ACME
server. Making regular backups of this folder is ideal.
INFO Obtaining bundled SAN certificate. domains="example.com, www.example.com"
INFO Use solver. domain=www.example.com type=http-01
INFO Use solver. domain=example.com type=http-01
INFO http01: Trying to solve HTTP-01. domain=www.example.com
INFO The server validated our request. domain=www.example.com
INFO http01: Trying to solve HTTP-01. domain=example.com
INFO The server validated our request. domain=example.com
INFO Validations succeeded; requesting certificates. domains="example.com, www.example.com"
INFO Waiting for certificates. timeout=30s interval=500ms domains="example.com, www.example.com"
INFO Server responded with a certificate. domains="example.com, www.example.com"
INFO Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.crt
INFO Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.issuer.crt
INFO Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.key
INFO Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.pem
INFO Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.json
Provjera generiranih datoteka SSL certifikata
Prikazuje sadržaj direktorija certifikata koji je stvorila usluga Lego, uključujući certifikat, privatni ključ i certifikat izdavatelja za odabranu domenu.
ls -la /etc/lego/$DOMAIN/certificates/
Direktorij certificates/ sadrži izdani .crt, .key, intermediate certifikate certifikacijskog tijela i metapodatke.
Implementacija certifikata na Apache
Ovaj primjer koristi varijablu ${DOMAIN}, koju biste već trebali imati postavljenu od početka vodiča. Prije pokretanja naredbi možete se uvjeriti da je varijabla ispravno postavljena, primjerice: echo ${DOMAIN}
Varijabla ${DOMAIN} koristi se u nazivu konfiguracijske datoteke, vrijednostima ServerName i ServerAlias te putanji do webroota.
Upozorenje! - putanje do SSL certifikata i privatnog ključa koriste domenu u obliku example-com. Putanje moraju odgovarati domeni korištenoj u Lego konfiguraciji.
cat > /etc/apache2/sites-available/${DOMAIN}-le-ssl.conf <<EOF
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName ${DOMAIN}
ServerAlias www.${DOMAIN}
DocumentRoot /var/www/${DOMAIN}/public
<Directory /var/www/${DOMAIN}/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
SSLEngine on
SSLCertificateFile /etc/lego/${DOMAIN}/certificates/${DOMAIN//./-}.crt
SSLCertificateKeyFile /etc/lego/${DOMAIN}/certificates/${DOMAIN//./-}.key
ErrorLog ${APACHE_LOG_DIR}/${DOMAIN}_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/${DOMAIN}_ssl_access.log combined
</VirtualHost>
</IfModule>
EOF
a2ensite ${DOMAIN}-le-ssl.conf
apache2ctl configtest
systemctl reload apache2
curl -I https://${DOMAIN}
curl -I https://www.${DOMAIN}
Rezultat: Ispravan HTTPS.
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
cat > ...-le-ssl.conf |
Stvara Apache HTTPS vhost. |
ServerName / ServerAlias |
Određuje apex domenu i poddomenu. |
SSLCertificateFile |
Putanja do certifikata. |
SSLCertificateKeyFile |
Putanja do privatnog ključa. |
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 automatski obnoviti certifikat, ali nakon instalacije sam ne stvara systemd jedinice za redovito izvršavanje. Za automatsko obnavljanje stoga je potrebno stvoriti dvije jedinice:
- lego-example-com-renew.service – pokreće provjeru i, ako je potrebno, obnavljanje certifikata.
- lego-example-com-renew.timer – osigurava da se usluga pokreće svakodnevno u zadano vrijeme.
Prije umetanja zamijenite example-com u nazivu service/timer svojim vlastitim nazivom ako je potrebno, i zamijenite example.com u putanji konfiguracije svojom vlastitom domenom.
cat > /etc/systemd/system/lego-${DOMAIN//./-}-renew.service <<EOF
[Unit]
Description=Renew ACME Certum SSL for example.com using Lego HTTP-01
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/lego --config /etc/lego/${DOMAIN}/lego.yml
EOF
cat > /etc/systemd/system/lego-${DOMAIN//./-}-renew.timer <<EOF
[Unit]
Description=Daily Lego renewal check for ${DOMAIN}
[Timer]
OnCalendar=*-*-* 03:20:00
RandomizedDelaySec=1800
Persistent=true
[Install]
WantedBy=timers.target
EOF
Nakon stvaranja jedinica provjerite njihov sadržaj:
cat /etc/systemd/system/lego-example-com-renew.service
echo "----------------"
cat /etc/systemd/system/lego-example-com-renew.timer
Ponovno učitajte nove jedinice, omogućite timer i provjerite radi li:
systemctl daemon-reload
systemctl enable --now lego-${DOMAIN//./-}-renew.timer
systemctl list-timers | grep lego
Rezultat: Timer je aktivan i systemd je zakazao njegovo sljedeće pokretanje.
| 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-${DOMAIN//./-}-renew.service
systemctl status lego-${DOMAIN//./-}-renew.service --no-pager
journalctl -u lego-${DOMAIN//./-}-renew.service -n 100 --no-pager
Rezultat: Ako certifikat nije blizu isteka, Lego može javiti da obnavljanje nije potrebno. To je ispravno ponašanje.
| Naredba / vrijednost | Što radi / što zamijeniti |
|---|---|
systemctl start ...service |
Ručno pokreće uslugu obnavljanja za test. |
systemctl status ... |
Prikazuje je li usluga uspješno završila |
journalctl -u ... |
Prikazuje najnovije zapisnike usluge. |
Popis dostupnih Lego jedinica:
ls -l /etc/systemd/system/lego*
systemctl list-timers | grep lego
Rezultat: Obje varijante prikazuju sve usluge i timere povezane s ACME klijentom Lego.
Kamo dalje?
Povratak na pomoć
Našli ste grešku ili ne razumete nešto? Pišite nam!
