ACME klijent Lego
ACME klijent Lego je nezavisan, besplatan projekat otvorenog koda napisan u Go jeziku. Idealan je za prilagođenu integraciju i skriptovanje i uživa široku podršku registara domena i DNS provajdera. Lego je fleksibilan ACME klijent koji se lako može integrisati u prilagođene sisteme i skripte. Pored HTTP-01 validacije, nudi DNS validaciju kroz mnoge DNS provajdere (lista podržanih DNS provajdera) za dobijanje WildCard SSL sertifikata.
Vodič koristi sintaksu proverenu na verziji Lego 5.*.* i namenjen je za Debian/Ubuntu sa Apache 2 i ACME klijentom Lego.
Sadržaj članka
- Instalacija Lego
- Apache, webroot
- Lego konfiguracioni fajlovi
- Izdavanje sertifikata
- Postavljanje na Apache
- Automatsko obnavljanje
Osnovni pojmovi
- ACME – protokol za automatizovano izdavanje i obnavljanje SSL/TLS sertifikata.
- HTTP-01 – ACME metoda validacije koja proverava vlasništvo nad domenom pomoću privremenog fajla dostupnog putem HTTP.
- DNS-01 – metoda validacije putem DNS TXT zapisa
_acme-challenge. - EAB kid + hmac – External Account Binding (EAB) podaci od sertifikacionog tela. Oni povezuju Certbot sa nalogom ili proizvodom.
- Systemd service - konfiguracioni fajl koji govori Linux sistemu kako da pokrene aplikaciju i održi je u radu čak i nakon ponovnog pokretanja servera.
Ako se domen example.com pojavi u primerima, uvek ga zamenite 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. |
Apache, webroot
Ovaj postupak kreira osnovnu VirtualHost konfiguraciju za domen na portu 80. Postavlja DocumentRoot, dozvole za veb direktorijum, kreira Apache logove, omogućava konfiguraciju pomoću a2ensite, proverava njenu ispravnost (apache2ctl configtest) i ponovo učitava izmene. Na kraju, proverava dostupnost veb sajta pomoću HTTP zahteva curl.
Pre pokretanja, zamenite vrednost example.com u liniji DOMAIN="example.com" sopstvenim domenom. 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
# 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
| 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 poddomen:
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, trebalo bi da se pojavi test stranica.
| 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 www.$DOMAIN |
Kreira obradu za poddomen 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 i hukovima.
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, vas@email.cz vašim kontakt e-mailom, a vrednosti KID / HMAC podacima iz vaše porudžbine ACME sertifikata.
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
Savet! Skoro kompletan YML sadržaj možete generisati direktno na serveru, a zatim samo popuniti ispravan e-mail, kid i hmacKey. Samo pokrenite komandu ispod i kopirajte sadržaj sa stranice index.html u fajl 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
Fajl lego.yml sadrži EAB HMAC, pa mora imati ograničene dozvole. U dokumentaciji koristite samo čuvare mesta.
chmod 600 /etc/lego/$DOMAIN/lego.yml
Provera dozvola i vlasnika fajla:
stat -c "%a %U:%G %n" /etc/lego/$DOMAIN/lego.yml
| 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.http-chal |
Validacija putem http. |
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. |
Izdavanje SSL/TLS sertifikata
Pre pokretanja, proverite echo ${DOMAIN} ili postavite promenljivu DOMAIN na ime vašeg domena DOMAIN="example.com". Alat Lego izvršava HTTP-01 validaciju pomoću fajla privremeno smeštenog u webroot, proverava vlasništvo nad domenom i zatim kreira SSL/TLS sertifikat. Sertifikat, privatni ključ i izdavalac (intermediate) sertifikat biće smešteni u direktorijum /etc/lego/${DOMAIN}/certificates/.
lego --config /etc/lego/$DOMAIN/lego.yml
Tokom generisanja, ACME klijent Lego će ispisati informacije o zahtevu:
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
Provera generisanih fajlova SSL sertifikata
Prikazuje sadržaj direktorijuma certificates koji je kreirao Lego servis, uključujući sertifikat, privatni ključ i sertifikat izdavaoca za izabrani domen.
ls -la /etc/lego/$DOMAIN/certificates/
Direktorijum certificates/ sadrži izdate .crt, .key, intermediate sertifikate sertifikacionog tela i metapodatke.
Postavljanje sertifikata na Apache
Ovaj primer koristi promenljivu ${DOMAIN}, koju bi trebalo da imate već postavljenu od početka vodiča. Pre pokretanja komandi, možete se uveriti da je promenljiva ispravno postavljena, na primer: echo ${DOMAIN}
Promenljiva ${DOMAIN} se koristi u imenu konfiguracionog fajla, vrednostima ServerName i ServerAlias i putanji do webroot-a.
Upozorenje! - putanje do SSL sertifikata i privatnog ključa koriste domen u obliku example-com. Putanje moraju odgovarati domenu korišćenom 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: Funkcionalan HTTPS.
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
cat > ...-le-ssl.conf |
Kreira Apache HTTPS vhost. |
ServerName / ServerAlias |
Navodi apex domen i poddomen. |
SSLCertificateFile |
Putanja do sertifikata. |
SSLCertificateKeyFile |
Putanja do privatnog ključa. |
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 automatski obnoviti sertifikat, ali nakon instalacije ne kreira sam systemd unite za redovno izvršavanje. Za automatsko obnavljanje je stoga potrebno kreirati dva unita:
- lego-example-com-renew.service – pokreće proveru i, ako je potrebno, obnavljanje sertifikata.
- lego-example-com-renew.timer – obezbeđuje da se servis pokreće svakodnevno u zadato vreme.
Pre umetanja, zamenite example-com u imenu servisa/tajmera sopstvenim imenom ako je potrebno, i zamenite example.com u putanji konfiguracije sopstvenim 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 kreiranja unita, proverite njihov sadržaj:
cat /etc/systemd/system/lego-example-com-renew.service
echo "----------------"
cat /etc/systemd/system/lego-example-com-renew.timer
Ponovo učitajte nove unite, omogućite tajmer i proverite da li radi:
systemctl daemon-reload
systemctl enable --now lego-${DOMAIN//./-}-renew.timer
systemctl list-timers | grep lego
Rezultat: Tajmer je aktivan i systemd je zakazao njegovo sledeće pokretanje.
| 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-${DOMAIN//./-}-renew.service
systemctl status lego-${DOMAIN//./-}-renew.service --no-pager
journalctl -u lego-${DOMAIN//./-}-renew.service -n 100 --no-pager
Rezultat: Ako sertifikat nije blizu isteka, Lego može prijaviti da obnavljanje nije potrebno. Ovo je ispravno ponašanje.
| Komanda / vrednost | Šta radi / šta zameniti |
|---|---|
systemctl start ...service |
Ručno pokreće servis za obnavljanje radi testa. |
systemctl status ... |
Prikazuje da li se servis uspešno završio |
journalctl -u ... |
Prikazuje najnovije logove servisa. |
Lista dostupnih Lego unita:
ls -l /etc/systemd/system/lego*
systemctl list-timers | grep lego
Rezultat: Obe varijante prikazuju sve servise i tajmere povezane sa ACME klijentom Lego.
Kuda dalje?
Nazad na Pomoć
Pronašli ste grešku ili vam nešto nije jasno? Pišite nam!
