ACME-klienten Lego - WildCard SSL
En detaljerad guide för att driftsätta ett stjärnformat WildCard SSL-certifikat via ACME-klienten Lego och API DNS-validering med webbhotellet VEDOS. Förfarandet är avsett för certifikat av typen example.com och *.example.com, där förnyelse bör vara automatisk utan att manuellt ange TXT-poster. Guiden använder ett ACME-certifikat från certifikatutfärdaren Certum. Certifikatet som används tjänar endast som exempel – driftsprincipen och ACME-driftsättningsförfarandet är desamma för alla certifikatutfärdare.
Guiden använder syntax som verifierats på Lego 5.2.2. Lego v5 ändrade vissa parametrar jämfört med äldre versioner, så vid ett fel som flag provided but not defined verifiera rätt syntax med lego accounts register --help, lego run --help eller lego --help.
Innehåll i artikeln
- Installation av Lego
- DNS API-leverantör
- Lego-konfigurationsfiler
- Utfärdande av certifikat
- Driftsättning till Apache
- Automatisk förnyelse
- Vanliga fel
Grundläggande begrepp
- ACME – protokoll för automatiserat utfärdande och förnyelse av SSL/TLS-certifikat.
- Lego – en ACME-klient skriven i Go. Den kan utföra DNS-validering via många DNS-leverantörer (lista över DNS-leverantörer som stöds).
- DNS-01 – validering via DNS TXT-posten
_acme-challenge. Den krävs för WildCard-certifikat. - EAB kid + hmac – External Account Binding (EAB)-uppgifter från certifikatutfärdaren. De kopplar Certbot till ett konto eller en produkt.
- VEDOS WAPI – VEDOS API-gränssnittet genom vilket Lego skapar och tar bort DNS TXT-poster.
- 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.
I alla visade exempel, ersätt domänen example.com 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. |
DNS API-leverantör
Denna guide använder DNS API från domänregistratorn Vedos, som erbjuder ett API för att hantera DNS för registrerade domäner. För Vedos webbhotell behöver du aktivera WAPI och även fylla i de tillåtna IP-adresserna och WAPI-lösenordet.
LEGO-klienten stöder hundratals andra DNS-leverantörer.
Du hittar deras lista på LEGO-webbplatsen - lista över DNS-leverantörer som stöds.
VPS-serverns IP-adresser
curl -4 ifconfig.me
curl -6 ifconfig.me
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
curl -4 ifconfig.me |
Visar serverns publika IPv4-adress, som behöver tillåtas i VEDOS WAPI. |
curl -6 ifconfig.me |
Visar serverns publika IPv6-adress, om VPS:en använder en. Det är lämpligt att tillåta även denna adress i VEDOS WAPI. |
I fältet Tillåtna IP-adresser anger du alla utgående IP-adresser för din server, vanligtvis både IPv4 och IPv6. Värdena separeras med ett mellanslag. VEDOS tillåter API-begäranden endast från de listade IP-adresserna.
Viktigt: Om du endast tillåter IPv4 och någon API-begäran går ut via IPv6 kan utfärdandet av certifikatet lyckas, men rensningen av TXT-poster misslyckas med felet Access not allowed from this IP address.
Rekommenderade värden för DNS-leverantören VEDOS
| Fält | Rekommenderat värde |
|---|---|
| Aktivera WAPI | På |
| Tillåtna IP-adresser | VPS:ens publika IPv4- och eventuellt IPv6-adress |
| Aviseringsmetod | POLL-kö |
| Föredraget protokoll | JSON |
| Lösenord | Det genererade WAPI-lösenordet, inte det vanliga administrationslösenordet |
Apache, webroot
Den grundläggande Apache-inställningen är en stödjande del. DNS-validering körs via DNS API, inte via HTTP, men Apache-vhosten behövs för att leverera webbplatsen efter att certifikatet har utfärdats.
›› Visa/Dölj avsnittInnan du kör, ersätt värdet example.com på raden DOMAIN="example.com" med din egen domän utan asterisken. 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
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äner:
cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
ServerAlias *.$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
| 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 *.$DOMAIN |
Tillåter hantering av valfri subdomän 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, DNS-leverantören och hooks.
Konfigurationsfilen .env
.env-filen är en textkonfigurationsfil där miljövariabler lagras, till exempel åtkomstuppgifter, API-nycklar eller applikationsinställningar. För tydlighetens skull kan du namnge filen provider-domain.env. Filen vedos-example.com.env kommer att innehålla VEDOS WAPI-inloggningsuppgifterna, så vi lagrar den i /etc/lego och ställer in begränsade behörigheter på den.
DOMAIN="example.com"
mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
DOMAIN="example.com" |
Ställer in domänen för följande kommandon. Ersätt med din egen domän. |
mkdir -p /etc/lego/$DOMAIN |
Skapar katalogen för Lego-data och konfiguration för den angivna domänen. |
nano /etc/lego/vedos-$DOMAIN.env |
Öppnar filen för VEDOS API-variablerna. |
I konfigurationen nedan, ersätt WEDOS_LOGIN med din VEDOS-inloggning och WEDOS_WAPI_PASSWORD med lösenordet som genererats i VEDOS WAPI. Du kan lämna värdena för timeout och interval som de är.
WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
WEDOS_USERNAME |
VEDOS-inloggningen för kontot som hanterar DNS-zonen. |
WEDOS_WAPI_PASSWORD |
WAPI-lösenordet som genererats i VEDOS-administrationen. |
WEDOS_PROPAGATION_TIMEOUT |
Den maximala väntetiden för DNS-spridning i sekunder. |
WEDOS_POLLING_INTERVAL |
Intervallet mellan kontroller av DNS-spridning. |
WEDOS_TTL |
TTL för TXT-posterna som skapas för ACME-utmaningen. |
chmod 600 /etc/lego/vedos-$DOMAIN.env
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, *.example.com med wildcard-namnet, vas@email.cz med din kontakt-e-post och värdena KID / HMAC med uppgifterna från din ACME-certifikatorder. Namn som certum-example eller example-com-wildcard är interna etiketter; du kan lämna dem, men med flera domäner är det lämpligt att byta namn på dem enligt domänen.
mkdir /etc/lego/$DOMAIN
nano /etc/lego/$DOMAIN/lego.yml
storage: /etc/lego/example.com
accounts:
certum-example:
server: certum
email: vas@email.cz
acceptsTermsOfService: true
eab:
kid: KID
hmacKey: HMAC
servers:
certum:
url: https://acme.certum.pl/directory
challenges:
vedos-dns:
dns:
provider: vedos
envFile: /etc/lego/vedos-example-com.env
resolvers:
- 1.1.1.1:53
certificates:
example-com-wildcard:
account: certum-example
challenge: vedos-dns
domains:
- example.com
- "*.example.com"
renew:
days: 30
hooks:
deploy:
command: systemctl reload apache2
| 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.vedos-dns |
DNS-01-validering via VEDOS-leverantören. |
envFile |
Filen med VEDOS API-inloggningsuppgifterna. |
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. |
chmod 600 /etc/lego/$DOMAIN/lego.yml
Filen lego.yml innehåller EAB HMAC, så den måste ha begränsade behörigheter. I kunddokumentation, använd endast platshållare.
Utfärdande av certifikat
Innan du kör, ersätt example.com i sökvägen med domänen du använde när du skapade katalogen. Den första körningen skapar ACME-kontot, ställer in DNS TXT-posterna via DNS API, utför DNS-01-validering och sparar certifikatet.
lego --config /etc/lego/$DOMAIN/lego.yml
Medan Lego väntar kan den skriva ut:
dns01: waiting for record propagation timeout=1h0m0s interval=30s
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
lego --config |
Kör Lego enligt konfigurationsfilen. Vid den första körningen utfärdar den certifikatet, vid efterföljande körningar hanterar den förnyelse. |
dns01: waiting for record propagation |
Lego har skapat TXT-posten och väntar tills den är synlig i DNS. |
timeout=1h0m0s |
Väntar högst en timme. |
interval=30s |
Kontrollerar DNS var 30:e sekund. |
Detta innebär att Lego kontrollerar DNS var 30:e sekund och väntar högst 1 timme. Efter framgång, verifiera filerna:
ls -la /etc/lego/$DOMAIN/certificates/
Katalogen certificates/ innehåller det utfärdade .crt, .key, certifikatutfärdarens mellanliggande certifikat och metadata.
Alternativt CLI-förfarande för Lego v5
›› Visa/Dölj avsnittOm du inte använder en konfigurationsfil anges EAB i Lego v5 under kontoregistreringen. Innan du kör, ersätt example.com med din egen domän, vas@email.cz med din egen e-post och KID / HMAC med värdena från din order.
lego accounts register \
--path /etc/lego/example.com \
--server https://acme.certum.pl/directory \
--email vas@email.cz \
--accept-tos \
--eab \
--eab.kid 'KID' \
--eab.hmac 'HMAC'
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
lego accounts register |
Registrerar ACME-kontot manuellt via CLI utan lego.yml. |
--path |
Katalog för kontot och certifikaten. |
--server |
Certum ACME-endpoint. |
--email |
Kontakt-e-post. |
--accept-tos |
Godkännande av användarvillkoren. |
--eab |
Aktiverar External Account Binding. |
--eab.kid / --eab.hmac |
EAB-uppgifter från CertManager. |
Listning av konton. I sökvägen, använd samma domän som i föregående kommando igen:
lego accounts list --path /etc/lego/example.com
Utfärdande av certifikat nu utan EAB-parametrar. Ersätt example.com med din egen domän och *.example.com med wildcard-namnet.
set -a
. /etc/lego/vedos-example.com.env
set +a
lego run \
--path /etc/lego/example.com \
--server https://acme.certum.pl/directory \
--email vas@email.cz \
--dns vedos \
--dns.resolvers 1.1.1.1:53 \
--domains example.com \
--domains '*.example.com'
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
set -a |
Exporterar automatiskt variablerna som laddas från filen. |
. /etc/lego/vedos-example.com.env |
Laddar VEDOS API-variablerna i det aktuella shellet. |
set +a |
Stänger av automatisk export av variabler. |
lego run |
Utfärdar eller förnyar certifikatet utan en konfigurationsfil. |
--dns vedos |
Använder DNS API. |
--domains |
Domänerna som kommer att finnas i certifikatet. |
Driftsätta certifikatet till Apache
Innan du skapar HTTPS-vhosten, ersätt example.com med din egen domän i filnamnet, värdena ServerName och ServerAlias, webroot-sökvägarna och certifikatsökvägarna. Dessa sökvägar måste matcha domänen som används i Lego-konfigurationen.
cat > /etc/apache2/sites-available/example.com-le-ssl.conf <<'EOF'
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias *.example.com
DocumentRoot /var/www/example.com/public
<Directory /var/www/example.com/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
SSLEngine on
SSLCertificateFile /etc/lego/example.com/certificates/example.com.crt
SSLCertificateKeyFile /etc/lego/example.com/certificates/example.com.key
ErrorLog ${APACHE_LOG_DIR}/example.com_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_ssl_access.log combined
</VirtualHost>
</IfModule>
EOF
a2ensite example.com-le-ssl.conf
apache2ctl configtest
systemctl reload apache2
curl -I https://example.com
curl -I https://test.example.com
| 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 wildcard-subdomänerna. |
SSLCertificateFile |
Sökväg till certifikatet från Lego. |
SSLCertificateKeyFile |
Sökväg till den privata nyckeln från Lego. |
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, men efter installationen skapar den inte en systemd-timer på egen hand. Regelbunden körning ställs in via en egen service och timer. Innan du infogar, ersätt example-com i service/timer-namnet med ditt eget säkra namn utan punkter, till exempel mojedomena-cz, och ersätt example.com i konfigurationssökvägen med din egen domän.
cat > /etc/systemd/system/lego-example-com-renew.service <<'EOF'
[Unit]
Description=Renew Certum WildCard SSL for example.com using Lego and VEDOS DNS
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/lego --config /etc/lego/example.com/lego.yml
EOF
cat > /etc/systemd/system/lego-example-com-renew.timer <<'EOF'
[Unit]
Description=Daily Lego renewal check for example.com
[Timer]
OnCalendar=*-*-* 03:20:00
RandomizedDelaySec=1800
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now lego-example-com-renew.timer
systemctl list-timers | grep lego
| 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-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
| 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. |
journalctl -u ... |
Visar tjänstens senaste loggar. |
Om certifikatet inte är nära utgången kan Lego rapportera att förnyelse inte behövs. Detta är korrekt beteende.
Vanliga fel
Okänd parameter i Lego
I Lego v5 är EAB-parametrarna --eab.kid och --eab.hmac. Parametrarna hör alltid till ett specifikt underkommando.
lego accounts register --help
lego accounts list --help
lego run --help
Rensning av TXT-poster misslyckas på en otillåten IP
Cleaning up failed ... Access not allowed from this IP address (2a02:...)
Lägg även till serverns IPv6-adress till de tillåtna IP-adresserna i VEDOS WAPI. Certifikatet kan utfärdas korrekt, men TXT-posterna kommer att finnas kvar i DNS efter valideringen.
Verifieringschecklista
dig TXT _acme-challenge.example.com +short
lego --config /etc/lego/example.com/lego.yml
systemctl status lego-example-com-renew.timer
apache2ctl configtest
curl -I https://example.com
| Kommando / värde | Vad det gör / vad som ska ersättas |
|---|---|
dig TXT |
Verifierar TXT-posterna i DNS. |
lego --config |
Kör Lego-konfigurationen. |
systemctl status |
Visar timerstatusen. |
apache2ctl configtest |
Verifierar Apache-konfigurationen. |
curl -I |
Verifierar HTTPS-svaret. |
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!
