TL;DR — Kurzzusammenfassung

Wildcard-SSL-Zertifikate mit Certbot und DNS-01. Deckt DNS-Plugins, Cloudflare-Konfiguration, automatische Erneuerung, Ratenlimits und Fehlerbehebung ab.

Wildcard-SSL-Zertifikate ermöglichen es einem einzigen Zertifikat, jede Subdomain Ihrer Domain zu sichern — *.example.com deckt api.example.com, app.example.com, staging.example.com und jede weitere Subdomain ab. Anstatt einzelne Zertifikate für jeden Dienst auszustellen, erhalten Sie ein einziges und stellen es über Ihre gesamte Infrastruktur bereit. Let’s Encrypt stellt Wildcard-Zertifikate kostenlos zur Verfügung, erfordert jedoch den DNS-01-Challenge zur Validierung — eine Anforderung, die HTTP-basierte Challenges nicht erfüllen können.

Dieser Leitfaden behandelt alle Aspekte des Erhaltens und der Pflege von Wildcard-Zertifikaten mit Certbot: von der Erklärung, warum DNS-01 obligatorisch ist, über manuelle Validierung, automatisierte DNS-Plugins, detaillierte Cloudflare-Konfiguration, automatische Erneuerung mit systemd, Multi-Domain-SANs, Ratenlimits bis hin zur Fehlerbehebung.

Voraussetzungen

Stellen Sie vor dem Start Folgendes bereit:

  • Ubuntu 22.04 LTS oder 24.04 LTS (oder jedes Debian-basierte Linux) mit sudo-Zugang.
  • Eine registrierte Domain mit DNS, das von einem unterstützten Anbieter verwaltet wird (Cloudflare, AWS Route 53, DigitalOcean, Google Cloud DNS oder manueller Zugang zu Ihrer Zone).
  • Certbot installiert — oder Sie werden es im Folgenden installieren.
  • Ein API-Token für Ihren DNS-Anbieter mit der Berechtigung, DNS-Einträge zu erstellen und zu löschen.
  • Port 80 muss NICHT geöffnet sein für DNS-01-Wildcard-Challenges (im Gegensatz zu HTTP-01-Challenges).

Warum Wildcard-Zertifikate?

Ein Standardzertifikat deckt einen oder mehrere spezifische Hostnamen ab: example.com, www.example.com, api.example.com. Wenn Sie eine neue Subdomain hinzufügen — metrics.example.com — müssen Sie sie entweder zur SAN-Liste hinzufügen und das Zertifikat neu ausstellen oder ein neues abrufen.

Ein Wildcard-Zertifikat (*.example.com) beseitigt dieses Problem:

  • Ein Zertifikat, unbegrenzte Subdomains — Jeder Hostname, der auf einer Ebene mit *.example.com übereinstimmt, wird automatisch abgedeckt.
  • Vereinfachtes Zertifikatsmanagement — Ein Erneuerungsprozess, ein privater Schlüssel, ein Deploy-Hook.
  • Funktioniert mit internen Diensten — Subdomains ohne öffentliche Webserver (interne APIs, Management-Oberflächen) werden abgedeckt, ohne HTTP-Zugang zu benötigen.
  • Kosteneffizienz — Let’s Encrypt stellt diese kostenlos aus. Kommerzielle Wildcard-Zertifikate von traditionellen CAs kosten typischerweise 100–300 $/Jahr.

Die einzige Einschränkung: Wildcards decken genau eine Subdomain-Ebene ab. *.example.com deckt api.example.com ab, aber nicht v1.api.example.com. Für verschachtelte Subdomains fügen Sie einen zweiten Wildcard hinzu: *.api.example.com.

ACME und den DNS-01-Challenge Verstehen

Let’s Encrypt verwendet das ACME-Protokoll (RFC 8555), um die Zertifikatsausstellung zu automatisieren. Sie müssen die Kontrolle über Ihre Domain durch Erfüllung eines Challenges nachweisen.

Warum HTTP-01 keine Wildcards validieren kann

Der HTTP-01-Challenge platziert eine Token-Datei unter http://example.com/.well-known/acme-challenge/<TOKEN>. Dies funktioniert für spezifische Hostnamen mit einem erreichbaren Webserver. Aber *.example.com repräsentiert eine unendliche Menge von Hostnamen — von denen die meisten möglicherweise keinen HTTP-Server haben. Der ACME-Server hat keine Möglichkeit, jede mögliche Subdomain zu prüfen, daher ist HTTP-01 durch die ACME-Spezifikation explizit für Wildcard-Zertifikate verboten.

Wie DNS-01 funktioniert

DNS-01 validiert die Domain-Kontrolle, indem bewiesen wird, dass Sie in die DNS-Zone schreiben können:

  1. Certbot kontaktiert den ACME-Server und fordert die Autorisierung für *.example.com an.
  2. Der ACME-Server stellt ein Token aus und weist an, einen TXT-Eintrag bei _acme-challenge.example.com mit einem spezifischen Wert zu veröffentlichen.
  3. Certbot (oder sein DNS-Plugin) erstellt den TXT-Eintrag über die API Ihres DNS-Anbieters.
  4. Der ACME-Server fragt DNS-Resolver ab, um das Vorhandensein des TXT-Eintrags zu überprüfen.
  5. Nach der Validierung wird das Zertifikat signiert und zurückgegeben.
  6. Certbot (oder sein Plugin) löscht den TXT-Eintrag.

DNS-01 funktioniert auch ohne Webserver, wenn Port 80 durch eine Firewall blockiert ist und wenn die Subdomain keinen A-Eintrag hat.

Certbot Installieren

Das snap-Paket ist die offiziell gepflegte Installationsmethode.

# Alle systemeigenen certbot-Pakete entfernen, um Konflikte zu vermeiden
sudo apt remove certbot -y 2>/dev/null || true

# Certbot über snap installieren
sudo snap install --classic certbot

# Symlink erstellen, damit certbot im PATH ist
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# Überprüfen
certbot --version

Manuelle DNS-Validierung

Für ein einmaliges Zertifikat oder zum Testen erfordert die manuelle DNS-Validierung keine API-Tokens.

sudo certbot certonly \
  --manual \
  --preferred-challenges dns \
  -d "*.example.com" \
  -d example.com

Certbot zeigt etwas wie folgt an:

Please deploy a DNS TXT record under the name:
_acme-challenge.example.com
with the following value:
gfj9Xq8R3mT2nKp1vLwY5sAqZdBcF7eH

Once deployed, press Enter to continue...

Überprüfen Sie die Verbreitung, bevor Sie Enter drücken:

dig +short TXT _acme-challenge.example.com
dig @8.8.8.8 +short TXT _acme-challenge.example.com

Hinweis: Die manuelle Validierung unterstützt keine automatische Erneuerung. Certbot fordert Sie auf, den TXT-Eintrag alle 60–89 Tage manuell neu zu erstellen. Für den Produktionseinsatz richten Sie ein automatisiertes DNS-Plugin ein.

Automatisierte DNS-Plugins

PluginAnbieterInstallationsbefehl
certbot-dns-cloudflareCloudflaresudo snap install certbot-dns-cloudflare
certbot-dns-route53AWS Route 53sudo snap install certbot-dns-route53
certbot-dns-googleGoogle Cloud DNSsudo snap install certbot-dns-google
certbot-dns-digitaloceanDigitalOceansudo snap install certbot-dns-digitalocean
certbot-dns-linodeLinode/Akamaisudo snap install certbot-dns-linode
certbot-dns-hetznerHetzner DNSpip install certbot-dns-hetzner

Detaillierte Cloudflare-Plugin-Konfiguration

Schritt 1: Cloudflare API-Token erstellen

Melden Sie sich im Cloudflare-Dashboard an → Mein ProfilAPI-TokensToken erstellen.

Verwenden Sie die Vorlage “Zone-DNS bearbeiten” und konfigurieren Sie:

  • Berechtigungen: ZoneDNSBearbeiten
  • Zonenressourcen: EinschließenSpezifische Zone → wählen Sie Ihre Domain
  • IP-Adressfilterung: Optionale Einschränkung auf die IP Ihres Servers

Schritt 2: Credentials-Datei erstellen

sudo mkdir -p /etc/letsencrypt/cloudflare

sudo tee /etc/letsencrypt/cloudflare/credentials.ini > /dev/null <<'EOF'
dns_cloudflare_api_token = IHR_CLOUDFLARE_API_TOKEN_HIER
EOF

sudo chmod 600 /etc/letsencrypt/cloudflare/credentials.ini
sudo chown root:root /etc/letsencrypt/cloudflare/credentials.ini

Sicherheitshinweis: Verwenden Sie niemals die veraltete Methode mit dns_cloudflare_email + dns_cloudflare_api_key (Global API Key). Das begrenzte API-Token reduziert das Risiko, falls die Credentials-Datei offengelegt wird.

Schritt 3: Plugin installieren

sudo snap install certbot-dns-cloudflare

sudo snap set certbot trust-plugin-with-root=ok
sudo snap connect certbot:plugin certbot-dns-cloudflare

Schritt 4: Zertifikat abrufen

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
  --dns-cloudflare-propagation-seconds 60 \
  -d example.com \
  -d "*.example.com" \
  --email admin@example.com \
  --agree-tos \
  --non-interactive

Schritt 5: Zertifikat überprüfen

sudo certbot certificates

Speicherorte der Zertifikatsdateien

DateiPfadZweck
Vollständige Kette/etc/letsencrypt/live/example.com/fullchain.pemZertifikat + Zwischen-CA (in Nginx/Apache verwenden)
Privater Schlüssel/etc/letsencrypt/live/example.com/privkey.pemPrivater Schlüssel — sorgfältig schützen
Nur Kette/etc/letsencrypt/live/example.com/chain.pemNur Zwischen-CA-Kette
Nur Zertifikat/etc/letsencrypt/live/example.com/cert.pemDomain-Zertifikat ohne Kette

Konfigurieren Sie Nginx für das Wildcard-Zertifikat:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name *.example.com example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

Automatische Erneuerung mit systemd

Certbot installiert beim Einrichten über snap oder apt automatisch einen systemd-Timer. Der Timer wird zweimal täglich ausgelöst und fordert ein neues Zertifikat nur an, wenn das bestehende 30 oder weniger Tage Restgültigkeit hat.

Timer überprüfen

sudo systemctl status certbot.timer
sudo systemctl list-timers certbot.timer

Deploy-Hook für Nginx hinzufügen

sudo bash -c 'cat >> /etc/letsencrypt/renewal/example.com.conf <<EOF

[renewalparams]
deploy_hook = systemctl reload nginx
EOF'

Erneuerung testen

sudo certbot renew --dry-run

Multi-Domain-Wildcards

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
  -d example.com \
  -d "*.example.com" \
  -d staging.example.net \
  -d "*.staging.example.net"

*.example.com deckt NICHT *.api.example.com ab. Jede Ebene erfordert einen separaten Wildcard-Eintrag.

Ratenlimits

LimitWertZeitfenster
Zertifikate pro registrierter Domain507 Tage
Doppelte Zertifikate57 Tage
Fehlgeschlagene Validierungen51 Stunde
Neue Bestellungen3003 Stunden

Tests mit der Staging-Umgebung

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
  --staging \
  -d example.com \
  -d "*.example.com"

Sobald Ihre Konfiguration korrekt funktioniert, löschen Sie das Staging-Zertifikat und rufen Sie ein Produktionszertifikat ab:

sudo certbot delete --cert-name example.com
sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
  -d example.com \
  -d "*.example.com"

Certbot vs. Alternativen

ToolWildcardDNS AutoLet’s EncryptAndere CAsHinweise
CertbotJa (Plugins)Plugin-basiertJaBegrenztOffizieller EFF-Client, breitestes Plugin-Ökosystem
acme.shJaEingebaut (150+)JaJaNur Bash, keine Abhängigkeiten, sehr portabel
CaddyJa (nativ)AutomatischJaJaKeine Konfiguration; DNS-Modul muss kompiliert werden
TraefikJa (nativ)AutomatischJaBegrenztIdeal für Container-Umgebungen
Kommerzielle CAJaNein (manuell)NeinJa100–300 $/Jahr, OV/EV-Optionen

Häufige Fehler Beheben

CAA-Eintrag blockiert die Ausstellung

Symptom: Error: CAA record for example.com prevents issuance

dig +short CAA example.com

Falls kein Let’s Encrypt-Eintrag vorhanden ist, fügen Sie einen hinzu:

example.com.  CAA 0 issue "letsencrypt.org"
example.com.  CAA 0 issuewild "letsencrypt.org"

Das Tag issuewild ist speziell für die Wildcard-Zertifikatsautorisierung erforderlich.

DNS-Weitergabeverzögerungen

Symptom: DNS problem: NXDOMAIN looking up TXT for _acme-challenge.example.com

Erhöhen Sie die Weitergabe-Wartezeit:

--dns-cloudflare-propagation-seconds 120

Überprüfen Sie, ob der TXT-Eintrag von einem öffentlichen Resolver sichtbar ist:

dig @8.8.8.8 +short TXT _acme-challenge.example.com
dig @1.1.1.1 +short TXT _acme-challenge.example.com

Ratenlimit erreicht

Symptom: Error creating new order :: too many certificates already issued

Warten Sie bis zum Ablauf des Ratenlimit-Zeitfensters, fügen Sie eine Domain zur SAN-Liste hinzu oder entfernen Sie eine, oder verwenden Sie --staging für weitere Tests.

Berechtigungsfehler bei der Credentials-Datei

Symptom: Unsafe permissions on credentials configuration file

sudo chmod 600 /etc/letsencrypt/cloudflare/credentials.ini
sudo chown root:root /etc/letsencrypt/cloudflare/credentials.ini

Zusammenfassung

Wildcard-SSL-Zertifikate von Let’s Encrypt bieten die Flexibilität, unbegrenzte Subdomains mit einem einzigen kostenlosen Zertifikat zu sichern. Die wichtigsten Punkte:

  • Wildcards erfordern den DNS-01-Challenge — HTTP-01 kann *.example.com nicht validieren.
  • Die manuelle DNS-Validierung funktioniert für einmalige Ausstellung, unterstützt aber keine automatische Erneuerung.
  • DNS-Plugins (certbot-dns-cloudflare, certbot-dns-route53 usw.) ermöglichen vollständig automatisierte Erneuerung.
  • Das Cloudflare API-Token muss die Berechtigung Zone:DNS:Bearbeiten haben; die Credentials-Datei muss chmod 600 sein.
  • Zertifikatsdateien liegen in /etc/letsencrypt/live/ — verwenden Sie immer fullchain.pem in Ihrer Webserver-Konfiguration.
  • Deploy-Hooks laden Nginx, HAProxy oder andere Dienste nach jeder Erneuerung neu.
  • Ratenlimits sind streng — verwenden Sie --staging zum Testen und --dry-run zur Validierung der Erneuerung.
  • CAA-Einträge müssen letsencrypt.org mit issuewild für die Wildcard-Autorisierung enthalten.

Verwandte Artikel