ACME-client Lego
De ACME-client Lego is een onafhankelijk, gratis, opensourceproject geschreven in de taal Go. Het is ideaal voor eigen integratie en scripting en geniet brede ondersteuning van domeinregistrars en DNS-providers. Lego is een flexibele ACME-client die eenvoudig kan worden geïntegreerd in eigen systemen en scripts. Naast HTTP-01-validatie biedt het DNS-validatie via veel DNS-providers (lijst met ondersteunde DNS-providers) voor het verkrijgen van WildCard SSL-certificaten.
De handleiding gebruikt syntaxis die is geverifieerd op versie Lego 5.*.* en is bedoeld voor Debian/Ubuntu met Apache 2 en de ACME-client Lego.
Inhoud van het artikel
- Lego-installatie
- Apache, webroot
- Lego-configuratiebestanden
- Uitgifte van het certificaat
- Uitrollen naar Apache
- Automatische verlenging
Basisbegrippen
- ACME – protocol voor geautomatiseerde uitgifte en verlenging van SSL/TLS-certificaten.
- HTTP-01 – ACME-validatiemethode die domeineigendom verifieert met behulp van een tijdelijk bestand dat bereikbaar is via HTTP.
- DNS-01 – validatiemethode via het DNS TXT-record
_acme-challenge. - EAB kid + hmac – External Account Binding (EAB)-gegevens van de certificeringsautoriteit. Ze koppelen Certbot aan een account of product.
- Systemd-service - een configuratiebestand dat het Linux-systeem vertelt hoe het een applicatie moet starten en draaiende moet houden, ook na een herstart van de server.
Als het domein example.com in de voorbeelden voorkomt, vervang het dan altijd door uw eigen domein.
Lego-installatie
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
Na een succesvolle installatie raden we aan de tijdelijke bestanden te verwijderen.
rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
apt update |
Werkt de pakketlijst bij. |
apt install -y curl tar |
Installeert de tools voor het downloaden en uitpakken van Lego. |
LEGO_URL=... |
Zoekt de URL van het nieuwste Linux amd64-releasepakket. |
curl -L -o lego.tar.gz |
Downloadt het Lego-archief. |
tar -xzf lego.tar.gz |
Pakt het archief uit. |
install -m 0755 lego /usr/local/bin/lego |
Installeert Lego als een uitvoerbaar systeemcommando. |
lego --version |
Controleert de geïnstalleerde versie van Lego. |
Apache, webroot
Deze procedure maakt een basis VirtualHost-configuratie voor het domein op poort 80. Het stelt DocumentRoot in, de rechten voor de webmap, maakt Apache-logs aan, schakelt de configuratie in met a2ensite, verifieert de juistheid ervan (apache2ctl configtest) en herlaadt de wijzigingen. Ten slotte verifieert het de beschikbaarheid van de website met een HTTP-verzoek curl.
Vervang voor het uitvoeren de waarde example.com in de regel DOMAIN="example.com" door uw eigen domein. De variabele $DOMAIN wordt vervolgens in de volgende commando's gebruikt voor paden, de Apache-vhost en de testpagina.
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
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
cd /var/www |
Gaat naar de map waar webbestanden gewoonlijk worden opgeslagen. |
apt update |
Werkt de pakketlijst bij. |
apt install -y apache2 |
Installeert Apache; -y bevestigt de installatie automatisch. |
systemctl enable --now apache2 |
Schakelt Apache in bij het opstarten van de server en start het tegelijkertijd. |
a2enmod rewrite headers ssl |
Schakelt modules in voor omleidingen, headers en HTTPS. |
DOMAIN="example.com" |
Stelt de domeinvariabele in. Vervang example.com door uw eigen domein. |
mkdir/chown/chmod/echo |
Maakt de webroot aan, stelt de rechten voor Apache in en slaat een eenvoudige testpagina op. |
HTTP-vhost voor zowel de apex als het subdomein:
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"
Resultaat: na het openen van http://example.com zou de testpagina moeten verschijnen.
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
cat > ... <<EOF |
Schrijft een nieuwe Apache HTTP-vhost naar een bestand in sites-available. |
ServerName $DOMAIN |
Het hoofddomein van de virtual host. |
ServerAlias www.$DOMAIN |
Zorgt voor de afhandeling van het subdomein op het eerste niveau. |
DocumentRoot |
De map van waaruit Apache content aanbiedt. |
a2ensite "$DOMAIN.conf" |
Schakelt de vhost in. |
apache2ctl configtest |
Verifieert de syntaxis van de Apache-configuratie. |
curl -I http://$DOMAIN |
Controleert de HTTP-respons van het domein. |
Lego-configuratiebestanden
De aanbevolen aanpak voor Lego v5 is om de instellingen op te slaan in een configuratiebestand. De systemd-service hoeft dan geen lang commando met domeinen en hooks te bevatten.
Configuratiebestand lego.yml
Het .yml-bestand is een tekstconfiguratiebestand in YAML-formaat, gebruikt voor een overzichtelijke notatie van instellingen, parameters en gestructureerde gegevens. Vervang voordat u de YAML-configuratie opslaat example.com door uw eigen domein, vas@email.cz door uw contact-e-mail en de waarden KID / HMAC door de gegevens uit uw ACME-certificaatbestelling.
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
Tip! U kunt een bijna volledige YML-inhoud direct op de server genereren en vervolgens alleen de juiste e-mail, kid en hmacKey invullen. Voer gewoon het onderstaande commando uit en kopieer de inhoud van de index.html-pagina naar het bestand lego.yml.
›› De voorbereide YML tonen/verbergen.
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
Het bestand lego.yml bevat de EAB HMAC, dus het moet beperkte rechten hebben. Gebruik in documentatie alleen tijdelijke waarden.
chmod 600 /etc/lego/$DOMAIN/lego.yml
De rechten en eigenaar van het bestand controleren:
stat -c "%a %U:%G %n" /etc/lego/$DOMAIN/lego.yml
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
storage |
Map voor het Lego-account, de certificaten en metadata. |
accounts |
Definitie van het ACME-account inclusief de e-mail en EAB-gegevens. |
servers.certum.url |
Het Certum ACME-endpoint. |
challenges.http-chal |
Validatie via http. |
certificates |
Lijst met certificaten die Lego moet beheren. |
domains |
Het apex-domein en het wildcard-domein in het certificaat. |
renew.days |
Hoeveel dagen voor het verlopen Lego moet verlengen. |
hooks.deploy.command |
Commando na een succesvolle uitgifte of verlenging, hier het herladen van Apache. |
Uitgifte van het SSL/TLS-certificaat
Controleer voor het uitvoeren echo ${DOMAIN} of stel de DOMAIN-variabele in op de naam van uw domein DOMAIN="example.com". De tool Lego voert HTTP-01-validatie uit met behulp van een bestand dat tijdelijk in de webroot is opgeslagen, verifieert het domeineigendom en maakt vervolgens een SSL/TLS-certificaat aan. Het certificaat, de privésleutel en het uitgevende (intermediaire) certificaat worden opgeslagen in de map /etc/lego/${DOMAIN}/certificates/.
lego --config /etc/lego/$DOMAIN/lego.yml
Tijdens het genereren toont de ACME-client Lego informatie over het verzoek:
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
De gegenereerde SSL-certificaatbestanden verifiëren
Toont de inhoud van de map certificates die is aangemaakt door de Lego-service, inclusief het certificaat, de privésleutel en het uitgevende certificaat voor het geselecteerde domein.
ls -la /etc/lego/$DOMAIN/certificates/
De map certificates/ bevat het uitgegeven .crt, .key, de intermediaire certificaten van de certificeringsautoriteit en metadata.
Het certificaat uitrollen naar Apache
Dit voorbeeld gebruikt de variabele ${DOMAIN}, die u vanaf het begin van de handleiding al ingesteld zou moeten hebben. Voordat u de commando's uitvoert, kunt u controleren of de variabele correct is ingesteld, bijvoorbeeld: echo ${DOMAIN}
De variabele ${DOMAIN} wordt gebruikt in de naam van het configuratiebestand, de waarden ServerName en ServerAlias en het pad naar de webroot.
Waarschuwing! - de paden naar het SSL-certificaat en de privésleutel gebruiken het domein in de vorm example-com. De paden moeten overeenkomen met het domein dat in de Lego-configuratie is gebruikt.
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}
Resultaat: werkende HTTPS.
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
cat > ...-le-ssl.conf |
Maakt de Apache HTTPS-vhost aan. |
ServerName / ServerAlias |
Geeft het apex-domein en het subdomein op. |
SSLCertificateFile |
Pad naar het certificaat. |
SSLCertificateKeyFile |
Pad naar de privésleutel. |
a2ensite |
Schakelt de HTTPS-vhost in. |
systemctl reload apache2 |
Herlaadt de nieuwe Apache-configuratie. |
curl -I https://... |
Controleert de HTTPS-respons. |
Automatische verlenging
Lego kan het certificaat automatisch verlengen, maar na de installatie maakt het niet zelf de systemd-units aan voor regelmatige uitvoering. Voor automatische verlenging moeten daarom twee units worden aangemaakt:
- lego-example-com-renew.service – voert de controle en, indien nodig, de verlenging van het certificaat uit.
- lego-example-com-renew.timer – zorgt ervoor dat de service dagelijks op een ingesteld tijdstip wordt uitgevoerd.
Vervang voor het invoegen indien nodig example-com in de naam van de service/timer door uw eigen naam, en vervang example.com in het configuratiepad door uw eigen domein.
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
Verifieer na het aanmaken van de units de inhoud ervan:
cat /etc/systemd/system/lego-example-com-renew.service
echo "----------------"
cat /etc/systemd/system/lego-example-com-renew.timer
Herlaad de nieuwe units, schakel de timer in en controleer of deze actief is:
systemctl daemon-reload
systemctl enable --now lego-${DOMAIN//./-}-renew.timer
systemctl list-timers | grep lego
Resultaat: de timer is actief en systemd heeft de volgende uitvoering ingepland.
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
lego-example-com-renew.service |
Systemd-service voor een eenmalige uitvoering van Lego renew/run. |
Type=oneshot |
De service start, doet zijn werk en eindigt. |
ExecStart |
Voert Lego uit volgens lego.yml. |
lego-example-com-renew.timer |
Systemd-timer die de service regelmatig uitvoert. |
OnCalendar |
Tijdstip van de dagelijkse controle. |
RandomizedDelaySec |
Willekeurige vertraging zodat de verzoeken niet allemaal exact tegelijk starten. |
Persistent=true |
Voert een gemiste uitvoering uit nadat de server is gestart. |
systemctl enable --now |
Schakelt de timer in en activeert deze onmiddellijk. |
Veilige test van de service:
systemctl start lego-${DOMAIN//./-}-renew.service
systemctl status lego-${DOMAIN//./-}-renew.service --no-pager
journalctl -u lego-${DOMAIN//./-}-renew.service -n 100 --no-pager
Resultaat: als het certificaat nog niet bijna verlopen is, kan Lego melden dat verlenging niet nodig is. Dit is correct gedrag.
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
systemctl start ...service |
Voert de verlengingsservice handmatig uit voor een test. |
systemctl status ... |
Toont of de service succesvol is voltooid |
journalctl -u ... |
Toont de meest recente logs van de service. |
Lijst met beschikbare Lego-units:
ls -l /etc/systemd/system/lego*
systemctl list-timers | grep lego
Resultaat: beide varianten tonen alle services en timers die gerelateerd zijn aan de ACME-client Lego.
Waar ga je nu naartoe?
Terug naar Help
Een fout gevonden of iets niet begrepen? Schrijf ons!
