SSLmentor

Hochwertige TLS/SSL-Zertifikate für Websites und Internetprojekte.

Lego & ACME WildCard

Lego & ACME WildCard

ACME-Client Lego - WildCard SSL

Eine ausführliche Anleitung für die Bereitstellung eines Stern-WildCard-SSL-Zertifikats über den ACME-Client Lego und die API-DNS-Validierung mit dem Webhosting VEDOS. Das Vorgehen ist für Zertifikate des Typs example.com und *.example.com gedacht, bei denen die Erneuerung automatisch erfolgen soll, ohne manuell TXT-Einträge einzugeben. Die Anleitung verwendet ein ACME-Zertifikat der Certum-Zertifizierungsstelle. Das verwendete Zertifikat dient nur als Beispiel – das Funktionsprinzip und das ACME-Bereitstellungsverfahren sind für alle Zertifizierungsstellen gleich.

Die Anleitung verwendet eine auf Lego 5.2.2 überprüfte Syntax. Lego v5 hat einige Parameter im Vergleich zu älteren Versionen geändert. Überprüfen Sie daher bei einem Fehler wie flag provided but not defined die korrekte Syntax mit lego accounts register --help, lego run --help oder lego --help.

Grundbegriffe

  • ACME – Protokoll für die automatisierte Ausstellung und Erneuerung von SSL/TLS-Zertifikaten.
  • Lego – ein in Go geschriebener ACME-Client. Er kann eine DNS-Validierung über viele DNS-Anbieter durchführen (Liste der unterstützten DNS-Anbieter).
  • DNS-01 – Validierung über den DNS-TXT-Eintrag _acme-challenge. Sie ist für WildCard-Zertifikate erforderlich.
  • EAB kid + hmac – External Account Binding (EAB)-Details von der Zertifizierungsstelle. Sie verknüpfen ACME client mit einem Konto oder Produkt.
  • VEDOS WAPI – die VEDOS-API-Schnittstelle, über die Lego DNS-TXT-Einträge erstellt und löscht.
  • Systemd-Dienst - eine Konfigurationsdatei, die dem Linux-System mitteilt, wie eine Anwendung gestartet und auch nach einem Serverneustart am Laufen gehalten wird.

Ersetzen Sie in allen gezeigten Beispielen die Domain example.com durch Ihre eigene Domain.

Lego-Installation

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

Nach einer erfolgreichen Installation empfehlen wir, die temporären Dateien zu entfernen.

rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
Befehl / Wert Was er bewirkt / was zu ersetzen ist
apt update Aktualisiert die Paketliste.
apt install -y curl tar Installiert die Tools zum Herunterladen und Entpacken von Lego.
LEGO_URL=... Ermittelt die URL des neuesten Linux-amd64-Release-Pakets.
curl -L -o lego.tar.gz Lädt das Lego-Archiv herunter.
tar -xzf lego.tar.gz Entpackt das Archiv.
install -m 0755 lego /usr/local/bin/lego Installiert Lego als ausführbaren Systembefehl.
lego --version Überprüft die installierte Version von Lego.

DNS-API-Anbieter

Diese Anleitung verwendet die DNS-API des Domain-Registrars Vedos, der eine API für die Verwaltung des DNS registrierter Domains anbietet. Für das Vedos-Webhosting müssen Sie WAPI aktivieren und außerdem die erlaubten IP-Adressen und das WAPI-Passwort eintragen.

Der LEGO-Client unterstützt Hunderte weiterer DNS-Anbieter.
Deren Liste finden Sie auf der LEGO-Website - Liste der unterstützten DNS-Anbieter.

IP-Adressen des VPS-Servers

curl -4 ifconfig.me
curl -6 ifconfig.me
Befehl / Wert Was er bewirkt / was zu ersetzen ist
curl -4 ifconfig.me Zeigt die öffentliche IPv4-Adresse des Servers an, die in VEDOS WAPI erlaubt werden muss.
curl -6 ifconfig.me Zeigt die öffentliche IPv6-Adresse des Servers an, falls der VPS eine verwendet. Es ist ratsam, auch diese Adresse in VEDOS WAPI zu erlauben.

Tragen Sie im Feld Erlaubte IP-Adressen alle ausgehenden IP-Adressen Ihres Servers ein, typischerweise sowohl IPv4 als auch IPv6. Die Werte werden durch ein Leerzeichen getrennt. VEDOS erlaubt API-Anfragen nur von den aufgelisteten IP-Adressen.
Wichtig: Wenn Sie nur IPv4 erlauben und eine API-Anfrage über IPv6 ausgeht, kann die Ausstellung des Zertifikats erfolgreich sein, aber die Bereinigung der TXT-Einträge schlägt mit dem Fehler Access not allowed from this IP address fehl.

Empfohlene Werte für den DNS-Anbieter VEDOS

Feld Empfohlener Wert
WAPI aktivieren Ein
Erlaubte IP-Adressen Die öffentliche IPv4- und ggf. IPv6-Adresse des VPS
Benachrichtigungsmethode POLL-Warteschlange
Bevorzugtes Protokoll JSON
Passwort Das generierte WAPI-Passwort, nicht das gewöhnliche Administrationspasswort

Apache, webroot

Die grundlegende Apache-Einrichtung ist ein unterstützender Teil. Die DNS-Validierung läuft über die DNS-API, nicht über HTTP, aber der Apache-vhost wird benötigt, um die Website nach der Ausstellung des Zertifikats auszuliefern.

›› Abschnitt anzeigen/ausblenden

Ersetzen Sie vor dem Ausführen den Wert example.com in der Zeile DOMAIN="example.com" durch Ihre eigene Domain ohne den Stern. Die Variable $DOMAIN wird dann in den folgenden Befehlen für Pfade, den Apache-vhost und die Testseite verwendet.

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
Befehl / Wert Was er bewirkt / was zu ersetzen ist
cd /var/www Wechselt in das Verzeichnis, in dem Webdateien üblicherweise gespeichert werden.
apt update Aktualisiert die Paketliste.
apt install -y apache2 Installiert Apache; -y bestätigt die Installation automatisch.
systemctl enable --now apache2 Aktiviert Apache beim Serverstart und startet ihn gleichzeitig.
a2enmod rewrite headers ssl Aktiviert Module für Weiterleitungen, Header und HTTPS.
DOMAIN="example.com" Setzt die Domain-Variable. Ersetzen Sie example.com durch Ihre eigene Domain.
mkdir/chown/chmod/echo Erstellt den webroot, setzt die Berechtigungen für Apache und speichert eine einfache Testseite.

HTTP-vhost sowohl für den Apex als auch für die Subdomains:


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
Befehl / Wert Was er bewirkt / was zu ersetzen ist
cat > ... <<EOF Schreibt einen neuen Apache-HTTP-vhost in eine Datei in sites-available.
ServerName $DOMAIN Die Hauptdomain des virtuellen Hosts.
ServerAlias *.$DOMAIN Erlaubt die Behandlung jeder Subdomain der ersten Ebene.
DocumentRoot Das Verzeichnis, aus dem Apache Inhalte ausliefert.
a2ensite $DOMAIN.conf Aktiviert den vhost.
apache2ctl configtest Überprüft die Syntax der Apache-Konfiguration.
curl -I http://$DOMAIN Überprüft die HTTP-Antwort der Domain.

Lego-Konfigurationsdateien

Der empfohlene Ansatz für Lego v5 ist, die Einstellungen in einer Konfigurationsdatei zu speichern. Der systemd-Dienst muss dann keinen langen Befehl mit Domains, dem DNS-Anbieter und Hooks enthalten.

Konfigurationsdatei .env

Die .env-Datei ist eine Textkonfigurationsdatei, in der Umgebungsvariablen gespeichert werden, zum Beispiel Zugangsdaten, API-Schlüssel oder Anwendungseinstellungen. Zur besseren Übersicht können Sie die Datei provider-domain.env nennen. Die Datei vedos-example.com.env enthält die VEDOS-WAPI-Zugangsdaten, daher speichern wir sie in /etc/lego und setzen darauf eingeschränkte Berechtigungen.

DOMAIN="example.com"

mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
Befehl / Wert Was er bewirkt / was zu ersetzen ist
DOMAIN="example.com" Setzt die Domain für die folgenden Befehle. Ersetzen Sie sie durch Ihre eigene Domain.
mkdir -p /etc/lego/$DOMAIN Erstellt das Verzeichnis für die Lego-Daten und die Konfiguration der angegebenen Domain.
nano /etc/lego/vedos-$DOMAIN.env Öffnet die Datei für die VEDOS-API-Variablen.

Ersetzen Sie in der folgenden Konfiguration WEDOS_LOGIN durch Ihren VEDOS-Login und WEDOS_WAPI_PASSWORD durch das in VEDOS WAPI generierte Passwort. Die timeout- und interval-Werte können Sie so belassen, wie sie sind.

WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
Befehl / Wert Was er bewirkt / was zu ersetzen ist
WEDOS_USERNAME Der VEDOS-Login des Kontos, das die DNS-Zone verwaltet.
WEDOS_WAPI_PASSWORD Das in der VEDOS-Administration generierte WAPI-Passwort.
WEDOS_PROPAGATION_TIMEOUT Die maximale Wartezeit auf die DNS-Verbreitung in Sekunden.
WEDOS_POLLING_INTERVAL Das Intervall zwischen den Prüfungen der DNS-Verbreitung.
WEDOS_TTL Die TTL der für die ACME-Challenge erstellten TXT-Einträge.
chmod 600 /etc/lego/vedos-$DOMAIN.env

Konfigurationsdatei lego.yml

Die .yml-Datei ist eine Textkonfigurationsdatei im YAML-Format, die für eine übersichtliche Notation von Einstellungen, Parametern und strukturierten Daten verwendet wird. Ersetzen Sie vor dem Speichern der YAML-Konfiguration example.com durch Ihre eigene Domain, *.example.com durch den Wildcard-Namen, vas@email.cz durch Ihre Kontakt-E-Mail und die Werte KID / HMAC durch die Angaben aus Ihrer ACME-Zertifikatsbestellung. Namen wie certum-example oder example-com-wildcard sind interne Bezeichnungen; Sie können sie belassen, aber bei mehreren Domains ist es ratsam, sie nach der Domain umzubenennen.

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
Befehl / Wert Was er bewirkt / was zu ersetzen ist
storage Verzeichnis für das Lego-Konto, die Zertifikate und Metadaten.
accounts Definition des ACME-Kontos einschließlich der E-Mail und der EAB-Details.
servers.certum.url Der Certum-ACME-Endpunkt.
challenges.vedos-dns DNS-01-Validierung über den Anbieter VEDOS.
envFile Die Datei mit den VEDOS-API-Zugangsdaten.
certificates Liste der Zertifikate, die Lego verwalten soll.
domains Die Apex-Domain und die Wildcard-Domain im Zertifikat.
renew.days Wie viele Tage vor Ablauf Lego erneuern soll.
hooks.deploy.command Befehl nach einer erfolgreichen Ausstellung oder Erneuerung, hier das Neuladen von Apache.
chmod 600 /etc/lego/$DOMAIN/lego.yml

Die Datei lego.yml enthält den EAB-HMAC, daher muss sie eingeschränkte Berechtigungen haben. Verwenden Sie in der Kundendokumentation nur Platzhalter.

Ausstellung des Zertifikats

Ersetzen Sie vor dem Ausführen example.com im Pfad durch die Domain, die Sie beim Erstellen des Verzeichnisses verwendet haben. Der erste Lauf erstellt das ACME-Konto, setzt die DNS-TXT-Einträge über die DNS-API, führt die DNS-01-Validierung durch und speichert das Zertifikat.

lego --config /etc/lego/$DOMAIN/lego.yml

Während des Wartens kann Lego ausgeben:

dns01: waiting for record propagation timeout=1h0m0s interval=30s
Befehl / Wert Was er bewirkt / was zu ersetzen ist
lego --config Führt Lego gemäß der Konfigurationsdatei aus. Beim ersten Lauf stellt es das Zertifikat aus, bei nachfolgenden Läufen übernimmt es die Erneuerung.
dns01: waiting for record propagation Lego hat den TXT-Eintrag erstellt und wartet, bis er im DNS sichtbar ist.
timeout=1h0m0s Wartet höchstens eine Stunde.
interval=30s Überprüft DNS alle 30 Sekunden.

Das bedeutet, dass Lego DNS alle 30 Sekunden überprüft und höchstens 1 Stunde wartet. Überprüfen Sie nach dem Erfolg die Dateien:

ls -la /etc/lego/$DOMAIN/certificates/

Das Verzeichnis certificates/ enthält das ausgestellte .crt, .key, Zwischenzertifikate der Zertifizierungsstelle und Metadaten.

Alternatives CLI-Verfahren für Lego v5

›› Abschnitt anzeigen/ausblenden

Wenn Sie keine Konfigurationsdatei verwenden, wird in Lego v5 das EAB bei der Kontoregistrierung eingegeben. Ersetzen Sie vor dem Ausführen example.com durch Ihre eigene Domain, vas@email.cz durch Ihre eigene E-Mail und KID / HMAC durch die Werte aus Ihrer Bestellung.

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'
Befehl / Wert Was er bewirkt / was zu ersetzen ist
lego accounts register Registriert das ACME-Konto manuell über die CLI ohne lego.yml.
--path Verzeichnis für das Konto und die Zertifikate.
--server Certum-ACME-Endpunkt.
--email Kontakt-E-Mail.
--accept-tos Zustimmung zu den Nutzungsbedingungen.
--eab Aktiviert External Account Binding.
--eab.kid / --eab.hmac EAB-Details aus CertManager.

Auflistung der Konten. Verwenden Sie im Pfad erneut dieselbe Domain wie im vorherigen Befehl:

lego accounts list --path /etc/lego/example.com

Ausstellung des Zertifikats nun ohne EAB-Parameter. Ersetzen Sie example.com durch Ihre eigene Domain und *.example.com durch den Wildcard-Namen.

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'
Befehl / Wert Was er bewirkt / was zu ersetzen ist
set -a Exportiert automatisch die aus der Datei geladenen Variablen.
. /etc/lego/vedos-example.com.env Lädt die VEDOS-API-Variablen in die aktuelle Shell.
set +a Schaltet den automatischen Export von Variablen aus.
lego run Stellt das Zertifikat aus oder erneuert es ohne Konfigurationsdatei.
--dns vedos Verwendet die DNS-API.
--domains Die Domains, die im Zertifikat enthalten sein werden.

Bereitstellen des Zertifikats auf Apache

Ersetzen Sie vor dem Erstellen des HTTPS-vhost example.com durch Ihre eigene Domain im Dateinamen, in den Werten ServerName und ServerAlias, in den webroot-Pfaden und in den Zertifikatspfaden. Diese Pfade müssen mit der in der Lego-Konfiguration verwendeten Domain übereinstimmen.


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
Befehl / Wert Was er bewirkt / was zu ersetzen ist
cat > ...-le-ssl.conf Erstellt den Apache-HTTPS-vhost.
ServerName / ServerAlias Gibt die Apex-Domain und die Wildcard-Subdomains an.
SSLCertificateFile Pfad zum Zertifikat von Lego.
SSLCertificateKeyFile Pfad zum privaten Schlüssel von Lego.
a2ensite Aktiviert den HTTPS-vhost.
systemctl reload apache2 Lädt die neue Apache-Konfiguration neu.
curl -I https://... Überprüft die HTTPS-Antwort.

Automatische Erneuerung

Lego kann das Zertifikat erneuern, erstellt aber nach der Installation nicht selbst einen systemd-Timer. Die regelmäßige Ausführung wird über einen eigenen Service und Timer eingerichtet. Ersetzen Sie vor dem Einfügen example-com im Namen des Service/Timers durch Ihren eigenen sicheren Namen ohne Punkte, zum Beispiel mojedomena-cz, und ersetzen Sie example.com im Konfigurationspfad durch Ihre eigene Domain.


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
Befehl / Wert Was er bewirkt / was zu ersetzen ist
lego-example-com-renew.service Systemd-Dienst für einen einmaligen Lauf von Lego renew/run.
Type=oneshot Der Dienst startet, erledigt seine Arbeit und beendet sich.
ExecStart Führt Lego gemäß lego.yml aus.
lego-example-com-renew.timer Systemd-Timer, der den Dienst regelmäßig ausführt.
OnCalendar Zeitpunkt der täglichen Prüfung.
RandomizedDelaySec Zufällige Verzögerung, damit die Anfragen nicht alle exakt zur gleichen Zeit starten.
Persistent=true Führt eine verpasste Ausführung nach dem Start des Servers aus.
systemctl enable --now Aktiviert den Timer und startet ihn sofort.

Sicherer Test des Dienstes:

systemctl start lego-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
Befehl / Wert Was er bewirkt / was zu ersetzen ist
systemctl start ...service Führt den Erneuerungsdienst manuell für einen Test aus.
journalctl -u ... Zeigt die neuesten Logs des Dienstes.

Wenn das Zertifikat nicht kurz vor dem Ablauf steht, meldet Lego möglicherweise, dass keine Erneuerung erforderlich ist. Das ist korrektes Verhalten.

Häufige Fehler

Unbekannter Parameter in Lego

In Lego v5 lauten die EAB-Parameter --eab.kid und --eab.hmac. Die Parameter gehören immer zu einem bestimmten Unterbefehl.

lego accounts register --help
lego accounts list --help
lego run --help

Bereinigung der TXT-Einträge schlägt bei einer nicht erlaubten IP fehl

Cleaning up failed ... Access not allowed from this IP address (2a02:...)

Fügen Sie auch die IPv6-Adresse des Servers zu den erlaubten IP-Adressen in VEDOS WAPI hinzu. Das Zertifikat kann korrekt ausgestellt werden, aber die TXT-Einträge bleiben nach der Validierung im DNS.

Prüf-Checkliste

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
Befehl / Wert Was er bewirkt / was zu ersetzen ist
dig TXT Überprüft die TXT-Einträge im DNS.
lego --config Führt die Lego-Konfiguration aus.
systemctl status Zeigt den Status des Timers.
apache2ctl configtest Überprüft die Apache-Konfiguration.
curl -I Überprüft die HTTPS-Antwort.

Zurück zur Infozentrum
Fehler gefunden oder etwas nicht verstanden? Schreiben Sie uns!

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