SSLmentor

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

Lego

Lego

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.

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.

›› Prikaži/Sakrij sekciju

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.

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