SSLmentor

Kvalitativa TLS/SSL-certifikat för webbplatser och internetprojekt.

Lego & ACME WildCard

Lego & ACME WildCard

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.

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
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 avsnitt

Innan 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 avsnitt

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

Tillbaka till Hjälp
Hittat ett fel eller förstår du inte något? Skriv till oss!

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