ACME-klienten Lego
ACME-klienten Lego är ett oberoende, gratis projekt med öppen källkod skrivet i programmeringsspråket Go. Den är idealisk för anpassad integration och skriptning och har brett stöd från domänregistratorer och DNS-leverantörer. Lego är en flexibel ACME-klient som enkelt kan integreras i anpassade system och skript. Förutom HTTP-01-validering erbjuder den DNS-validering via många DNS-leverantörer (lista över DNS-leverantörer som stöds) för att erhålla WildCard SSL-certifikat.
Guiden använder syntax som verifierats på version Lego 5.*.* och är avsedd för Debian/Ubuntu med Apache 2 och ACME-klienten Lego.
Innehåll i artikeln
- Installation av Lego
- Apache, webroot
- Lego-konfigurationsfiler
- Utfärdande av certifikat
- Driftsättning till Apache
- Automatisk förnyelse
Grundläggande begrepp
- ACME – protokoll för automatiserat utfärdande och förnyelse av SSL/TLS-certifikat.
- HTTP-01 – ACME-valideringsmetod som verifierar domänägarskap med hjälp av en tillfällig fil som är tillgänglig via HTTP.
- DNS-01 – valideringsmetod via DNS TXT-posten
_acme-challenge. - EAB kid + hmac – External Account Binding (EAB)-uppgifter från certifikatutfärdaren. De kopplar Certbot till ett konto eller en produkt.
- Systemd service - en konfigurationsfil som talar om för Linux-systemet hur en applikation ska startas och hållas igång även efter en serveromstart.
Om domänen example.com förekommer i exemplen, ersätt den alltid med din egen domän.
Installation av 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
Efter en lyckad installation rekommenderar vi att du tar bort de tillfälliga filerna.
rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
apt update |
Uppdaterar paketlistan. |
apt install -y curl tar |
Installerar verktygen för att ladda ner och extrahera Lego. |
LEGO_URL=... |
Hittar URL:en till det senaste Linux amd64-utgåvepaketet. |
curl -L -o lego.tar.gz |
Laddar ner Lego-arkivet. |
tar -xzf lego.tar.gz |
Extraherar arkivet. |
install -m 0755 lego /usr/local/bin/lego |
Installerar Lego som ett körbart systemkommando. |
lego --version |
Verifierar den installerade versionen av Lego. |
Apache, webroot
Detta förfarande skapar en grundläggande VirtualHost-konfiguration för domänen på port 80. Det ställer in DocumentRoot, behörigheter för webbkatalogen, skapar Apache-loggar, aktiverar konfigurationen med a2ensite, verifierar att den är korrekt (apache2ctl configtest) och laddar om ändringarna. Slutligen verifierar det webbplatsens tillgänglighet med en HTTP-begäran curl.
Innan du kör, ersätt värdet example.com på raden DOMAIN="example.com" med din egen domän. Variabeln $DOMAIN används sedan i följande kommandon för sökvägar, Apache-vhost och testsidan.
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
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
cd /var/www |
Byter till katalogen där webbfiler vanligtvis lagras. |
apt update |
Uppdaterar paketlistan. |
apt install -y apache2 |
Installerar Apache; -y bekräftar installationen automatiskt. |
systemctl enable --now apache2 |
Aktiverar Apache vid serverstart och startar den samtidigt. |
a2enmod rewrite headers ssl |
Aktiverar moduler för omdirigeringar, headers och HTTPS. |
DOMAIN="example.com" |
Ställer in domänvariabeln. Ersätt example.com med din egen domän. |
mkdir/chown/chmod/echo |
Skapar webroot, ställer in behörigheter för Apache och sparar en enkel testsida. |
HTTP-vhost för både apex och subdomän:
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"
Resultat: Efter att du öppnat http://example.com bör testsidan visas.
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
cat > ... <<EOF |
Skriver en ny Apache HTTP-vhost till en fil i sites-available. |
ServerName $DOMAIN |
Den virtuella värdens huvuddomän. |
ServerAlias www.$DOMAIN |
Skapar hantering för subdomänen på första nivån. |
DocumentRoot |
Katalogen från vilken Apache levererar innehåll. |
a2ensite "$DOMAIN.conf" |
Aktiverar vhosten. |
apache2ctl configtest |
Verifierar Apache-konfigurationens syntax. |
curl -I http://$DOMAIN |
Verifierar domänens HTTP-svar. |
Lego-konfigurationsfiler
Det rekommenderade tillvägagångssättet för Lego v5 är att lagra inställningarna i en konfigurationsfil. Systemd-tjänsten behöver då inte innehålla ett långt kommando med domäner och hooks.
Konfigurationsfilen lego.yml
.yml-filen är en textkonfigurationsfil i YAML-format, som används för en tydlig notation av inställningar, parametrar och strukturerade data. Innan du sparar YAML-konfigurationen, ersätt example.com med din egen domän, vas@email.cz med din kontakt-e-post och värdena KID / HMAC med uppgifterna från din ACME-certifikatorder.
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
Tips! Du kan generera ett nästan komplett YML-innehåll direkt på servern och sedan bara fylla i rätt e-post, kid och hmacKey. Kör bara kommandot nedan och kopiera innehållet från index.html-sidan till lego.yml-filen.
›› Visa/Dölj det förberedda 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
Filen lego.yml innehåller EAB HMAC, så den måste ha begränsade behörigheter. I dokumentationen, använd endast platshållare.
chmod 600 /etc/lego/$DOMAIN/lego.yml
Kontrollera filens behörigheter och ägare:
stat -c "%a %U:%G %n" /etc/lego/$DOMAIN/lego.yml
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
storage |
Katalog för Lego-kontot, certifikaten och metadata. |
accounts |
Definition av ACME-kontot inklusive e-post och EAB-uppgifter. |
servers.certum.url |
Certum ACME-endpointen. |
challenges.http-chal |
Validering via http. |
certificates |
Lista över certifikat som Lego ska hantera. |
domains |
Apex-domänen och wildcard-domänen i certifikatet. |
renew.days |
Hur många dagar före utgången Lego ska förnya. |
hooks.deploy.command |
Kommando efter ett lyckat utfärdande eller förnyelse, här omladdning av Apache. |
Utfärdande av SSL/TLS-certifikatet
Innan du kör, kontrollera echo ${DOMAIN} eller ställ in DOMAIN-variabeln till namnet på din domän DOMAIN="example.com". Verktyget Lego utför HTTP-01-validering med hjälp av en fil som tillfälligt lagras i webroot, verifierar domänägarskap och skapar sedan ett SSL/TLS-certifikat. Certifikatet, den privata nyckeln och utfärdarens (mellanliggande) certifikat lagras i katalogen /etc/lego/${DOMAIN}/certificates/.
lego --config /etc/lego/$DOMAIN/lego.yml
Under genereringen skriver ACME-klienten Lego ut information om begäran:
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
Verifiera de genererade SSL-certifikatfilerna
Visar innehållet i certifikatkatalogen som skapats av Lego-tjänsten, inklusive certifikatet, den privata nyckeln och utfärdarens certifikat för den valda domänen.
ls -la /etc/lego/$DOMAIN/certificates/
Katalogen certificates/ innehåller det utfärdade .crt, .key, certifikatutfärdarens mellanliggande certifikat och metadata.
Driftsätta certifikatet till Apache
Detta exempel använder variabeln ${DOMAIN}, som du redan bör ha ställt in från början av guiden. Innan du kör kommandona kan du säkerställa att variabeln är korrekt inställd, till exempel: echo ${DOMAIN}
Variabeln ${DOMAIN} används i konfigurationsfilens namn, värdena ServerName och ServerAlias samt sökvägen till webroot.
Varning! - sökvägarna till SSL-certifikatet och den privata nyckeln använder domänen i formen example-com. Sökvägarna måste matcha domänen som används i Lego-konfigurationen.
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}
Resultat: Fungerande HTTPS.
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
cat > ...-le-ssl.conf |
Skapar Apache HTTPS-vhosten. |
ServerName / ServerAlias |
Anger apex-domänen och subdomänen. |
SSLCertificateFile |
Sökväg till certifikatet. |
SSLCertificateKeyFile |
Sökväg till den privata nyckeln. |
a2ensite |
Aktiverar HTTPS-vhosten. |
systemctl reload apache2 |
Laddar om den nya Apache-konfigurationen. |
curl -I https://... |
Verifierar HTTPS-svaret. |
Automatisk förnyelse
Lego kan förnya certifikatet automatiskt, men efter installationen skapar den inte systemd-enheterna för regelbunden körning på egen hand. Två enheter behöver därför skapas för automatisk förnyelse:
- lego-example-com-renew.service – kör kontrollen och, om det behövs, förnyelsen av certifikatet.
- lego-example-com-renew.timer – ser till att tjänsten körs dagligen vid en angiven tidpunkt.
Innan du infogar, ersätt example-com i service/timer-namnet med ditt eget namn om det behövs, och ersätt example.com i konfigurationssökvägen med din egen domän.
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
Efter att du skapat enheterna, verifiera deras innehåll:
cat /etc/systemd/system/lego-example-com-renew.service
echo "----------------"
cat /etc/systemd/system/lego-example-com-renew.timer
Ladda om de nya enheterna, aktivera timern och verifiera att den är igång:
systemctl daemon-reload
systemctl enable --now lego-${DOMAIN//./-}-renew.timer
systemctl list-timers | grep lego
Resultat: Timern är aktiv och systemd har schemalagt dess nästa körning.
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
lego-example-com-renew.service |
Systemd-tjänst för en engångskörning av Lego renew/run. |
Type=oneshot |
Tjänsten startar, gör sitt arbete och avslutas. |
ExecStart |
Kör Lego enligt lego.yml. |
lego-example-com-renew.timer |
Systemd-timer som kör tjänsten regelbundet. |
OnCalendar |
Tidpunkt för den dagliga kontrollen. |
RandomizedDelaySec |
Slumpmässig fördröjning så att begärandena inte alla startar exakt samtidigt. |
Persistent=true |
Kör en missad körning efter att servern startar. |
systemctl enable --now |
Aktiverar timern och startar den omedelbart. |
Säkert test av tjänsten:
systemctl start lego-${DOMAIN//./-}-renew.service
systemctl status lego-${DOMAIN//./-}-renew.service --no-pager
journalctl -u lego-${DOMAIN//./-}-renew.service -n 100 --no-pager
Resultat: Om certifikatet inte är nära utgången kan Lego rapportera att förnyelse inte behövs. Detta är korrekt beteende.
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
systemctl start ...service |
Kör förnyelsetjänsten manuellt för ett test. |
systemctl status ... |
Visar om tjänsten avslutades framgångsrikt |
journalctl -u ... |
Visar tjänstens senaste loggar. |
Lista över tillgängliga Lego-enheter:
ls -l /etc/systemd/system/lego*
systemctl list-timers | grep lego
Resultat: Båda varianterna visar alla tjänster och timrar relaterade till ACME-klienten Lego.
Vart går du härnäst?
Tillbaka till Hjälp
Hittat ett fel eller förstår du inte något? Skriv till oss!
