SSLmentor

Kwaliteit TLS/SSL-certificaten voor websites en internetprojecten.

Lego & ACME WildCard

Lego & ACME WildCard

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.

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/verbergen

Vervang 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/verbergen

Als 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.

Terug naar Help
Een fout gevonden of iets niet begrepen? Schrijf ons!

CA Sectigo
CA RapidSSL
CA Thawte
CA GeoTrust
CA DigiCert
CA Certum