ACME-client Lego - WildCard SSL
Een gedetailleerde handleiding voor het uitrollen van een star WildCard SSL-certificaat via de ACME-client Lego en API DNS-validatie met de VEDOS-webhosting. De procedure is bedoeld voor certificaten van het type example.com en *.example.com, waarbij de verlenging automatisch moet verlopen zonder handmatig TXT-records in te voeren. De handleiding gebruikt een ACME-certificaat van de Certum certificeringsautoriteit. Het gebruikte certificaat dient slechts als voorbeeld – het werkingsprincipe en de ACME-implementatieprocedure zijn hetzelfde voor alle certificeringsautoriteiten.
De handleiding gebruikt syntaxis die is geverifieerd op Lego 5.2.2. Lego v5 heeft enkele parameters gewijzigd ten opzichte van oudere versies, dus in geval van een fout zoals flag provided but not defined verifieert u de juiste syntaxis met lego accounts register --help, lego run --help of lego --help.
Inhoud van het artikel
- Lego-installatie
- DNS API-provider
- Lego-configuratiebestanden
- Uitgifte van het certificaat
- Uitrollen naar Apache
- Automatische verlenging
- Veelvoorkomende fouten
Basisbegrippen
- ACME – protocol voor geautomatiseerde uitgifte en verlenging van SSL/TLS-certificaten.
- Lego – een ACME-client geschreven in Go. Het kan DNS-validatie uitvoeren via veel DNS-providers (lijst met ondersteunde DNS-providers).
- DNS-01 – validatie via het DNS TXT-record
_acme-challenge. Het is vereist voor WildCard-certificaten. - EAB kid + hmac – External Account Binding (EAB)-gegevens van de certificeringsautoriteit. Ze koppelen Certbot aan een account of product.
- VEDOS WAPI – de VEDOS API-interface waarmee Lego DNS TXT-records aanmaakt en verwijdert.
- 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.
Vervang in alle getoonde voorbeelden het domein example.com 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. |
DNS API-provider
Deze handleiding gebruikt de DNS API van domeinregistrar Vedos, die een API biedt voor het beheren van de DNS van geregistreerde domeinen. Voor Vedos-webhosting moet u WAPI activeren en ook de toegestane IP-adressen en het WAPI-wachtwoord invullen.
De LEGO-client ondersteunt honderden andere DNS-providers.
Hun lijst vindt u op de LEGO-website - lijst met ondersteunde DNS-providers.
IP-adressen van de VPS-server
curl -4 ifconfig.me
curl -6 ifconfig.me
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
curl -4 ifconfig.me |
Toont het publieke IPv4-adres van de server, dat in VEDOS WAPI moet worden toegestaan. |
curl -6 ifconfig.me |
Toont het publieke IPv6-adres van de server, als de VPS er een gebruikt. Het is aan te raden om ook dit adres in VEDOS WAPI toe te staan. |
Voer in het veld Toegestane IP-adressen alle uitgaande IP-adressen van uw server in, doorgaans zowel IPv4 als IPv6. De waarden worden gescheiden door een spatie. VEDOS staat API-verzoeken alleen toe vanaf de vermelde IP-adressen.
Belangrijk: als u alleen IPv4 toestaat en een API-verzoek via IPv6 uitgaat, kan de uitgifte van het certificaat slagen, maar zal het opschonen van de TXT-records mislukken met de fout Access not allowed from this IP address.
Aanbevolen waarden voor de VEDOS DNS-provider
| Veld | Aanbevolen waarde |
|---|---|
| WAPI activeren | Aan |
| Toegestane IP-adressen | Het publieke IPv4- en eventueel IPv6-adres van de VPS |
| Notificatiemethode | POLL-wachtrij |
| Voorkeursprotocol | JSON |
| Wachtwoord | Het gegenereerde WAPI-wachtwoord, niet het gewone beheerderswachtwoord |
Apache, webroot
De basisconfiguratie van Apache is een ondersteunend onderdeel. DNS-validatie verloopt via de DNS API, niet via HTTP, maar de Apache-vhost is nodig om de website aan te bieden nadat het certificaat is uitgegeven.
›› Sectie tonen/verbergenVervang voor het uitvoeren de waarde example.com in de regel DOMAIN="example.com" door uw eigen domein zonder het sterretje. 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
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 de subdomeinen:
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
| 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 *.$DOMAIN |
Maakt de afhandeling van elk subdomein op het eerste niveau mogelijk. |
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, de DNS-provider en hooks te bevatten.
Configuratiebestand .env
Het .env-bestand is een tekstconfiguratiebestand waarin omgevingsvariabelen worden opgeslagen, bijvoorbeeld toegangsgegevens, API-sleutels of applicatie-instellingen. Voor de duidelijkheid kunt u het bestand provider-domein.env noemen. Het bestand vedos-example.com.env bevat de VEDOS WAPI-inloggegevens, dus we slaan het op in /etc/lego en stellen er beperkte rechten voor in.
DOMAIN="example.com"
mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
DOMAIN="example.com" |
Stelt het domein in voor de volgende commando's. Vervang door uw eigen domein. |
mkdir -p /etc/lego/$DOMAIN |
Maakt de map aan voor de Lego-gegevens en configuratie van het opgegeven domein. |
nano /etc/lego/vedos-$DOMAIN.env |
Opent het bestand voor de VEDOS API-variabelen. |
Vervang in de onderstaande configuratie WEDOS_LOGIN door uw VEDOS-login en WEDOS_WAPI_PASSWORD door het in VEDOS WAPI gegenereerde wachtwoord. De waarden voor timeout en interval kunt u laten zoals ze zijn.
WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
WEDOS_USERNAME |
De VEDOS-login van het account dat de DNS-zone beheert. |
WEDOS_WAPI_PASSWORD |
Het WAPI-wachtwoord dat in de VEDOS-administratie is gegenereerd. |
WEDOS_PROPAGATION_TIMEOUT |
De maximale wachttijd voor DNS-propagatie in seconden. |
WEDOS_POLLING_INTERVAL |
Het interval tussen de controles van de DNS-propagatie. |
WEDOS_TTL |
De TTL van de TXT-records die voor de ACME-challenge worden aangemaakt. |
chmod 600 /etc/lego/vedos-$DOMAIN.env
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, *.example.com door de wildcard-naam, vas@email.cz door uw contact-e-mail en de waarden KID / HMAC door de gegevens uit uw ACME-certificaatbestelling. Namen zoals certum-example of example-com-wildcard zijn interne labels; u kunt ze laten staan, maar bij meerdere domeinen is het aan te raden ze te hernoemen op basis van het domein.
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
| 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.vedos-dns |
DNS-01-validatie via de VEDOS-provider. |
envFile |
Het bestand met de VEDOS API-inloggegevens. |
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. |
chmod 600 /etc/lego/$DOMAIN/lego.yml
Het bestand lego.yml bevat de EAB HMAC, dus het moet beperkte rechten hebben. Gebruik in klantdocumentatie alleen tijdelijke waarden.
Uitgifte van het certificaat
Vervang voor het uitvoeren example.com in het pad door het domein dat u hebt gebruikt bij het aanmaken van de map. De eerste uitvoering maakt het ACME-account aan, stelt de DNS TXT-records in via de DNS API, voert DNS-01-validatie uit en slaat het certificaat op.
lego --config /etc/lego/$DOMAIN/lego.yml
Tijdens het wachten kan Lego het volgende tonen:
dns01: waiting for record propagation timeout=1h0m0s interval=30s
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
lego --config |
Voert Lego uit volgens het configuratiebestand. Bij de eerste uitvoering geeft het het certificaat uit, bij volgende uitvoeringen handelt het de verlenging af. |
dns01: waiting for record propagation |
Lego heeft het TXT-record aangemaakt en wacht tot het zichtbaar is in DNS. |
timeout=1h0m0s |
Wacht maximaal een uur. |
interval=30s |
Controleert DNS elke 30 seconden. |
Dit betekent dat Lego elke 30 seconden DNS controleert en maximaal 1 uur wacht. Verifieer na succes de bestanden:
ls -la /etc/lego/$DOMAIN/certificates/
De map certificates/ bevat het uitgegeven .crt, .key, de intermediaire certificaten van de certificeringsautoriteit en metadata.
Alternatieve CLI-procedure voor Lego v5
›› Sectie tonen/verbergenAls u geen configuratiebestand gebruikt, wordt in Lego v5 de EAB tijdens de accountregistratie ingevoerd. Vervang voor het uitvoeren example.com door uw eigen domein, vas@email.cz door uw eigen e-mail en KID / HMAC door de waarden uit uw bestelling.
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'
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
lego accounts register |
Registreert het ACME-account handmatig via de CLI zonder lego.yml. |
--path |
Map voor het account en de certificaten. |
--server |
Certum ACME-endpoint. |
--email |
Contact-e-mail. |
--accept-tos |
Akkoord met de servicevoorwaarden. |
--eab |
Schakelt External Account Binding in. |
--eab.kid / --eab.hmac |
EAB-gegevens uit CertManager. |
Lijst met accounts. Gebruik in het pad opnieuw hetzelfde domein als in het vorige commando:
lego accounts list --path /etc/lego/example.com
Uitgifte van het certificaat nu zonder EAB-parameters. Vervang example.com door uw eigen domein en *.example.com door de wildcard-naam.
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'
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
set -a |
Exporteert automatisch de uit het bestand geladen variabelen. |
. /etc/lego/vedos-example.com.env |
Laadt de VEDOS API-variabelen in de huidige shell. |
set +a |
Schakelt het automatisch exporteren van variabelen uit. |
lego run |
Geeft het certificaat uit of verlengt het zonder configuratiebestand. |
--dns vedos |
Gebruikt de DNS API. |
--domains |
De domeinen die in het certificaat komen. |
Het certificaat uitrollen naar Apache
Vervang voordat u de HTTPS-vhost aanmaakt example.com door uw eigen domein in de bestandsnaam, de waarden ServerName en ServerAlias, de webroot-paden en de certificaatpaden. Deze paden moeten overeenkomen met het domein dat in de Lego-configuratie is gebruikt.
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
| 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 de wildcard-subdomeinen op. |
SSLCertificateFile |
Pad naar het certificaat van Lego. |
SSLCertificateKeyFile |
Pad naar de privésleutel van Lego. |
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 verlengen, maar na de installatie maakt het niet zelf een systemd-timer aan. Regelmatige uitvoering wordt ingesteld via een eigen service en timer. Vervang voor het invoegen example-com in de naam van de service/timer door uw eigen veilige naam zonder punten, bijvoorbeeld mojedomena-cz, en vervang example.com in het configuratiepad door uw eigen domein.
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
| 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-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
systemctl start ...service |
Voert de verlengingsservice handmatig uit voor een test. |
journalctl -u ... |
Toont de meest recente logs van de service. |
Als het certificaat nog niet bijna verlopen is, kan Lego melden dat verlenging niet nodig is. Dit is correct gedrag.
Veelvoorkomende fouten
Onbekende parameter in Lego
In Lego v5 zijn de EAB-parameters --eab.kid en --eab.hmac. De parameters horen altijd bij een specifiek subcommando.
lego accounts register --help
lego accounts list --help
lego run --help
Het opschonen van TXT-records mislukt op een niet-toegestaan IP
Cleaning up failed ... Access not allowed from this IP address (2a02:...)
Voeg ook het IPv6-adres van de server toe aan de toegestane IP-adressen in VEDOS WAPI. Het certificaat kan correct worden uitgegeven, maar de TXT-records blijven na de validatie in DNS staan.
Verificatiechecklist
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
| Commando / waarde | Wat het doet / wat te vervangen |
|---|---|
dig TXT |
Verifieert de TXT-records in DNS. |
lego --config |
Voert de Lego-configuratie uit. |
systemctl status |
Toont de status van de timer. |
apache2ctl configtest |
Verifieert de Apache-configuratie. |
curl -I |
Controleert de HTTPS-respons. |
Waar ga je nu naartoe?
Terug naar Help
Een fout gevonden of iets niet begrepen? Schrijf ons!
