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:
- Certbot kontaktiert den ACME-Server und fordert die Autorisierung für
*.example.coman. - Der ACME-Server stellt ein Token aus und weist an, einen TXT-Eintrag bei
_acme-challenge.example.commit einem spezifischen Wert zu veröffentlichen. - Certbot (oder sein DNS-Plugin) erstellt den TXT-Eintrag über die API Ihres DNS-Anbieters.
- Der ACME-Server fragt DNS-Resolver ab, um das Vorhandensein des TXT-Eintrags zu überprüfen.
- Nach der Validierung wird das Zertifikat signiert und zurückgegeben.
- 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
| Plugin | Anbieter | Installationsbefehl |
|---|---|---|
certbot-dns-cloudflare | Cloudflare | sudo snap install certbot-dns-cloudflare |
certbot-dns-route53 | AWS Route 53 | sudo snap install certbot-dns-route53 |
certbot-dns-google | Google Cloud DNS | sudo snap install certbot-dns-google |
certbot-dns-digitalocean | DigitalOcean | sudo snap install certbot-dns-digitalocean |
certbot-dns-linode | Linode/Akamai | sudo snap install certbot-dns-linode |
certbot-dns-hetzner | Hetzner DNS | pip install certbot-dns-hetzner |
Detaillierte Cloudflare-Plugin-Konfiguration
Schritt 1: Cloudflare API-Token erstellen
Melden Sie sich im Cloudflare-Dashboard an → Mein Profil → API-Tokens → Token erstellen.
Verwenden Sie die Vorlage “Zone-DNS bearbeiten” und konfigurieren Sie:
- Berechtigungen:
Zone→DNS→Bearbeiten - Zonenressourcen:
Einschließen→Spezifische 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
| Datei | Pfad | Zweck |
|---|---|---|
| Vollständige Kette | /etc/letsencrypt/live/example.com/fullchain.pem | Zertifikat + Zwischen-CA (in Nginx/Apache verwenden) |
| Privater Schlüssel | /etc/letsencrypt/live/example.com/privkey.pem | Privater Schlüssel — sorgfältig schützen |
| Nur Kette | /etc/letsencrypt/live/example.com/chain.pem | Nur Zwischen-CA-Kette |
| Nur Zertifikat | /etc/letsencrypt/live/example.com/cert.pem | Domain-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
| Limit | Wert | Zeitfenster |
|---|---|---|
| Zertifikate pro registrierter Domain | 50 | 7 Tage |
| Doppelte Zertifikate | 5 | 7 Tage |
| Fehlgeschlagene Validierungen | 5 | 1 Stunde |
| Neue Bestellungen | 300 | 3 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
| Tool | Wildcard | DNS Auto | Let’s Encrypt | Andere CAs | Hinweise |
|---|---|---|---|---|---|
| Certbot | Ja (Plugins) | Plugin-basiert | Ja | Begrenzt | Offizieller EFF-Client, breitestes Plugin-Ökosystem |
| acme.sh | Ja | Eingebaut (150+) | Ja | Ja | Nur Bash, keine Abhängigkeiten, sehr portabel |
| Caddy | Ja (nativ) | Automatisch | Ja | Ja | Keine Konfiguration; DNS-Modul muss kompiliert werden |
| Traefik | Ja (nativ) | Automatisch | Ja | Begrenzt | Ideal für Container-Umgebungen |
| Kommerzielle CA | Ja | Nein (manuell) | Nein | Ja | 100–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.comnicht 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:Bearbeitenhaben; die Credentials-Datei musschmod 600sein. - Zertifikatsdateien liegen in
/etc/letsencrypt/live/— verwenden Sie immerfullchain.pemin Ihrer Webserver-Konfiguration. - Deploy-Hooks laden Nginx, HAProxy oder andere Dienste nach jeder Erneuerung neu.
- Ratenlimits sind streng — verwenden Sie
--stagingzum Testen und--dry-runzur Validierung der Erneuerung. - CAA-Einträge müssen
letsencrypt.orgmitissuewildfür die Wildcard-Autorisierung enthalten.