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.
Inhalt des Artikels
- Lego-Installation
- DNS-API-Anbieter
- Lego-Konfigurationsdateien
- Ausstellung des Zertifikats
- Bereitstellung auf Apache
- Automatische Erneuerung
- Häufige Fehler
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/ausblendenErsetzen 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/ausblendenWenn 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. |
Wie geht es weiter?
Zurück zur Infozentrum
Fehler gefunden oder etwas nicht verstanden? Schreiben Sie uns!
