Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Wildcard-Zertifikat mit Certbot für nginx
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Ein Wildcard-Zertifikat gilt für alle Subdomains einer Domain auf einmal, z. B. für www.start.de, blog.start.de und wiki.start.de. Neue Subdomains bekommen damit sofort HTTPS, ohne dass für jede ein eigenes Zertifikat nötig ist. Diese Anleitung holt ein kostenloses Wildcard-Zertifikat von Let's Encrypt mit Certbot und bindet es in nginx ein, am Beispiel start.de.
Vorbemerkungen
- Voraussetzung: Ein Server, der aus dem Internet erreichbar ist, mit nginx und der Website aus der Anleitung Statische Website mit nginx. Die Domain
start.degehört dir und zeigt perA-Eintrag auf den Server (dort Abschnitt „Im Internet veröffentlichen“, Schritte 1 bis 3). - Was
*.start.deabdeckt: Der Stern steht für genau eine Ebene.blog.start.deist abgedeckt,test.blog.start.denicht. Die Domainstart.deselbst ist ebenfalls nicht enthalten. Deshalb beantragt diese Anleitung ein Zertifikat für beide Namen,start.deund*.start.de. - Nachweis über DNS: Bei normalen Zertifikaten legt Certbot eine Datei auf den Webserver, die Let's Encrypt abruft. Für Wildcard-Zertifikate verlangt Let's Encrypt einen anderen Nachweis: einen
TXT-Eintrag im DNS der Domain. Damit zeigst du, dass du die ganze Domain verwaltest und nicht nur einen Webserver. - Manueller Weg: Diese Anleitung setzt den
TXT-Eintrag von Hand in der Weboberfläche deines Domain-Anbieters. Das funktioniert bei jedem Anbieter. Der Nachteil: Das Zertifikat gilt derzeit 90 Tage, und auch die Verlängerung ist Handarbeit (Abschnitt „Verlängern“). Let's Encrypt verschickt keine Erinnerungs-E-Mails mehr. Trage dir den Termin deshalb selbst in den Kalender ein. - Automatisch geht es nur mit Plugin: Für einige Anbieter gibt es Certbot-Plugins in apt, die den
TXT-Eintrag selbst setzen und die Verlängerung automatisch erledigen, z. B.python3-certbot-dns-netcup,python3-certbot-dns-cloudflareoderpython3-certbot-dns-ovh. Die ganze Liste zeigtapt search certbot-dns.
Zertifikat beantragen
1. Paketlisten aktualisieren
Damit apt die aktuellen Versionen von Certbot und den DNS-Werkzeugen kennt.
sudo apt update
2. Certbot und DNS-Werkzeuge installieren
certbot beantragt das Zertifikat. bind9-dnsutils enthält den Befehl dig, mit dem du prüfst, ob der TXT-Eintrag schon im Internet sichtbar ist.
sudo apt install certbot bind9-dnsutils
Prüfen: Die Ausgabe nennt die Version, z. B. certbot 4.0.0.
certbot --version
3. Zertifikat anfordern
certonlyholt nur das Zertifikat und ändert nichts an nginx. Die Konfiguration schreibst du danach selbst.--manualmit--preferred-challenges dnswählt den Nachweis über einenTXT-Eintrag, den du von Hand setzt.--cert-name start.delegt den Namen fest, unter dem Certbot das Zertifikat ablegt:/etc/letsencrypt/live/start.de/.- Die beiden
-dnennen die Namen im Zertifikat.'*.start.de'steht in einfachen Anführungszeichen, damit die Shell den Stern nicht als Platzhalter für Dateinamen auswertet.
sudo certbot certonly --manual --preferred-challenges dns --cert-name start.de -d start.de -d '*.start.de'
Beim allerersten Aufruf fragt Certbot nach einer E-Mail-Adresse für wichtige Hinweise und nach den Nutzungsbedingungen von Let's Encrypt (mit Y zustimmen). Die Frage nach Werbe-E-Mails kannst du mit N beantworten.
4. Ersten TXT-Eintrag anlegen
Certbot zeigt jetzt einen Namen und einen Wert, etwa so:
Please deploy a DNS TXT record under the name:
_acme-challenge.start.de.
with the following value:
<zufälliger Wert aus etwa 43 Zeichen>
Noch nicht Enter drücken. Öffne in der Weboberfläche deines Domain-Anbieters die DNS-Einstellungen von start.de und lege einen neuen Eintrag an:
| Feld | Eingabe |
|---|---|
| Typ | TXT |
| Name / Host | _acme-challenge (manche Anbieter wollen den vollen Namen _acme-challenge.start.de) |
| Wert / Inhalt | der Wert aus dem Terminal, genau abgeschrieben, am besten kopiert |
| TTL | der kleinste angebotene Wert, z. B. 300 Sekunden |
Speichere den Eintrag und drücke dann im Terminal Enter.
5. Zweiten TXT-Eintrag anlegen
Weil das Zertifikat zwei Namen enthält, zeigt Certbot einen zweiten Wert unter demselben Namen _acme-challenge.start.de. Lege dafür einen weiteren TXT-Eintrag an, mit gleichem Namen und dem neuen Wert. Den ersten Eintrag nicht ändern oder löschen, beide müssen gleichzeitig bestehen.
Drücke noch nicht Enter, sondern prüfe zuerst im nächsten Schritt, ob beide Einträge sichtbar sind.
6. TXT-Einträge prüfen
Öffne ein zweites Terminal. dig fragt hier gezielt einen öffentlichen DNS-Server (1.1.1.1) nach den TXT-Einträgen. So siehst du, was auch Let's Encrypt sehen wird.
dig +short TXT _acme-challenge.start.de @1.1.1.1
Prüfen: Die Ausgabe enthält beide Werte in Anführungszeichen. Erscheint nichts oder nur ein Wert, warte eine bis fünf Minuten und frage erneut. Manche Anbieter brauchen länger, bis Änderungen im Internet sichtbar sind.
7. Nachweis abschließen
Wechsle zurück ins erste Terminal und drücke Enter. Let's Encrypt prüft jetzt beide Einträge und stellt das Zertifikat aus.
Prüfen: Die Ausgabe enthält Successfully received certificate. und die Pfade /etc/letsencrypt/live/start.de/fullchain.pem und privkey.pem. Meldet Certbot Incorrect TXT record oder No TXT record found, war ein Eintrag noch nicht sichtbar oder falsch abgeschrieben. Dann Schritt 3 wiederholen. Certbot zeigt dabei neue Werte, die alten TXT-Einträge ersetzt du durch die neuen.
8. Zertifikat anzeigen
sudo certbot certificates
Prüfen: Beim Eintrag Certificate Name: start.de stehen Domains: start.de *.start.de und bei Expiry Date ein Datum in knapp 90 Tagen. Trage dir einen Termin etwa 30 Tage vorher für die Verlängerung ein.
9. TXT-Einträge entfernen
Die beiden TXT-Einträge werden nicht mehr gebraucht. Lösche sie in der Weboberfläche des Anbieters. Bei der Verlängerung verlangt Certbot ohnehin neue Werte.
nginx einrichten
10. Bisherige Konfiguration sichern
Die folgenden Schritte ersetzen die Konfiguration von start.de. Die Kopie liegt außerhalb von sites-enabled, damit nginx sie nicht als zweite Website lädt.
sudo cp -p /etc/nginx/sites-available/start.de /root/start.de.vor-wildcard
11. Zertifikat als Baustein anlegen
Die beiden Zeilen, die auf das Zertifikat zeigen, kommen in eine eigene Datei. Jede Website unter start.de bindet sie mit einer include-Zeile ein. Das ist der eigentliche Vorteil des Wildcard-Zertifikats: Für eine neue Subdomain genügt diese eine Zeile.
fullchain.pem– das Zertifikat samt Zwischenzertifikat von Let's Encrypt, das Browser zur Prüfung brauchenprivkey.pem– der geheime Schlüssel. Er ist nur fürrootlesbar, nginx liest ihn beim Start mit Administratorrechten.
sudo nano /etc/nginx/snippets/ssl-start.de.conf
Füge diesen Inhalt ein (im Terminal mit Strg+Umschalt+V), speichere mit Strg+O und Enter und beende nano mit Strg+X:
# Wildcard-Zertifikat für start.de und *.start.de
ssl_certificate /etc/letsencrypt/live/start.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/start.de/privkey.pem;
12. Website auf HTTPS umstellen
Die Datei bekommt zwei server-Blöcke:
- Der erste nimmt alle Anfragen auf Port 80 an, für
start.deund jede Subdomain (*.start.de), und leitet sie dauerhaft auf HTTPS um.$hostbehält den aufgerufenen Namen bei,$request_uriden Pfad. - Der zweite ist die Website auf Port 443.
sslschaltet die Verschlüsselung ein,http2 ondas schnellere Protokoll HTTP/2. nginx 1.28 erlaubt ab Werk nur die sicheren Verfahren TLS 1.2 und 1.3. Eigene Einstellungen dafür sind nicht nötig.
sudo nano /etc/nginx/sites-available/start.de
Die Datei hat schon Inhalt, der vollständig ersetzt wird. Lösche ihn zuerst: Alt+\ springt an den Anfang, Alt+A beginnt eine Markierung, Alt+/ springt ans Ende, Strg+K schneidet alles Markierte aus. Füge diesen Inhalt ein, speichere mit Strg+O und Enter und beende nano mit Strg+X:
# HTTP: alles auf HTTPS umleiten
server {
listen 80;
listen [::]:80;
server_name start.de *.start.de;
return 301 https://$host$request_uri;
}
# HTTPS: die Website start.de
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name start.de www.start.de;
include snippets/ssl-start.de.conf;
root /var/www/start.de/html;
index index.html;
access_log /var/log/nginx/start.de.access.log;
error_log /var/log/nginx/start.de.error.log;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
location ~* \.(css|js|png|jpe?g|gif|svg|webp|ico|woff2?)$ {
expires 7d;
}
}
Beispiel: eine weitere Subdomain
Als Beispiel bekommt test.start.de eine eigene kleine Website, die dasselbe Zertifikat nutzt.
13. DNS-Eintrag für die Subdomain anlegen
Lege beim Domain-Anbieter einen A-Eintrag mit dem Namen test und der IPv4-Adresse des Servers an (bei IPv6 zusätzlich AAAA). Alternativ ein A-Eintrag mit dem Namen *: Dann zeigt jede beliebige Subdomain auf den Server.
Prüfen: Nach einigen Minuten erscheint die Adresse des Servers.
dig +short test.start.de @1.1.1.1
14. Ordner für die Subdomain anlegen
Wie in der Anleitung Statische Website mit nginx gehört der Ordner deinem Benutzer, damit du ohne sudo Dateien ablegen kannst.
sudo mkdir -p /var/www/test.start.de/html
sudo chown -R "$USER":"$USER" /var/www/test.start.de
15. Startseite anlegen
nano /var/www/test.start.de/html/index.html
Füge diese Zeile ein, speichere mit Strg+O und Enter und beende nano mit Strg+X:
<h1>test.start.de mit Wildcard-Zertifikat</h1>
16. Konfiguration für die Subdomain anlegen
Nur ein HTTPS-Block ist nötig. Die Umleitung von HTTP erledigt schon der erste Block aus Schritt 12, weil er für *.start.de gilt. Das Zertifikat kommt über dieselbe include-Zeile.
sudo nano /etc/nginx/sites-available/test.start.de
Füge diesen Inhalt ein, speichere mit Strg+O und Enter und beende nano mit Strg+X:
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name test.start.de;
include snippets/ssl-start.de.conf;
root /var/www/test.start.de/html;
index index.html;
}
17. Subdomain einschalten
sudo ln -s /etc/nginx/sites-available/test.start.de /etc/nginx/sites-enabled/test.start.de
18. Konfiguration testen und nginx neu laden
&& sorgt dafür, dass nginx nur neu geladen wird, wenn der Test erfolgreich war.
sudo nginx -t && sudo systemctl reload nginx
Prüfen: Die Ausgabe enthält test is successful. Meldet nginx cannot load certificate, stimmt der Pfad in Schritt 11 nicht mit dem aus Schritt 7 überein.
19. Firewall für HTTPS öffnen
Nur nötig, wenn ufw eingeschaltet ist. Das Profil Nginx Full öffnet Port 80 und 443.
sudo ufw allow 'Nginx Full'
Testen
20. Umleitung auf HTTPS prüfen
curl -sI http://start.de/ | grep -E '^HTTP|^Location'
Prüfen: Die Ausgabe lautet HTTP/1.1 301 Moved Permanently und Location: https://start.de/.
21. Beide Websites über HTTPS abrufen
curl prüft dabei das Zertifikat. Wäre es ungültig oder passte nicht zum Namen, bräche der Befehl mit einer Fehlermeldung ab.
curl -sI https://start.de/ | head -n 1
curl -s https://test.start.de/
Prüfen: Die erste Ausgabe lautet HTTP/2 200, die zweite <h1>test.start.de mit Wildcard-Zertifikat</h1>.
22. Namen im Zertifikat anzeigen
openssl s_client baut eine Verbindung auf wie ein Browser, openssl x509 zeigt die Namen, für die das gelieferte Zertifikat gilt.
openssl s_client -connect test.start.de:443 -servername test.start.de < /dev/null 2>/dev/null | openssl x509 -noout -ext subjectAltName
Prüfen: Die Ausgabe enthält DNS:*.start.de und DNS:start.de.
Verlängern
Das Zertifikat gilt derzeit 90 Tage. Certbot schlägt die Verlängerung ab 30 Tage vor Ablauf vor, früher ist sie auch möglich. sudo certbot renew funktioniert bei manuell beantragten Zertifikaten nicht, weil Certbot den TXT-Eintrag nicht selbst setzen kann. Der automatische Verlängerungsdienst von Certbot meldet deshalb im Log für dieses Zertifikat einen Fehler. Das ist bei diesem Weg normal.
1. Ablaufdatum prüfen
sudo certbot certificates
Prüfen: Bei Expiry Date steht, wie viele Tage das Zertifikat noch gilt (VALID: … days).
2. Zertifikat neu anfordern
Derselbe Befehl wie in Schritt 3. Certbot erkennt das vorhandene Zertifikat und fragt, ob es erneuert werden soll: Wähle Renew & replace the certificate. Danach folgen wieder zwei TXT-Einträge mit neuen Werten. Gehe dabei wie in den Schritten 4 bis 7 vor und lösche danach die Einträge (Schritt 9).
sudo certbot certonly --manual --preferred-challenges dns --cert-name start.de -d start.de -d '*.start.de'
3. nginx neu laden
nginx liest das neue Zertifikat erst beim Neuladen. Die Pfade bleiben gleich, die Konfiguration muss nicht geändert werden.
sudo systemctl reload nginx
Prüfen: Das neue Ablaufdatum liegt wieder knapp 90 Tage in der Zukunft.
echo | openssl s_client -connect start.de:443 -servername start.de 2>/dev/null | openssl x509 -noout -enddate
Prüfen der Installation
certbot --version
sudo nginx -T 2>/dev/null | grep 'include snippets/ssl-start.de.conf'
Prüfen: Der erste Befehl zeigt die Version von Certbot, der zweite zwei include-Zeilen, je eine pro Website.
Deinstallieren
1. Subdomain ausschalten und löschen
sudo rm /etc/nginx/sites-enabled/test.start.de /etc/nginx/sites-available/test.start.de
Achtung: Löscht auch die Dateien der Test-Website.
sudo rm -r /var/www/test.start.de
2. Alte Konfiguration von start.de zurückholen
Stellt die HTTP-Konfiguration aus Schritt 10 wieder her.
sudo cp -p /root/start.de.vor-wildcard /etc/nginx/sites-available/start.de
3. Zertifikats-Baustein löschen
sudo rm /etc/nginx/snippets/ssl-start.de.conf
4. nginx testen und neu laden
sudo nginx -t && sudo systemctl reload nginx
5. Zertifikat löschen
Entfernt Zertifikat, Schlüssel und Verlängerungseinstellungen unter /etc/letsencrypt. Certbot fragt zur Sicherheit nach.
sudo certbot delete --cert-name start.de
6. Sicherung löschen
sudo rm /root/start.de.vor-wildcard
7. DNS-Einträge aufräumen
Lösche beim Domain-Anbieter den A-Eintrag für test (oder *) aus Schritt 13 und eventuell noch vorhandene TXT-Einträge _acme-challenge.
8. Optional: Certbot entfernen
Nur ausführen, wenn keine andere Website ein Zertifikat von Certbot nutzt. bind9-dnsutils bleibt installiert, weil dig auch sonst nützlich ist.
sudo apt purge certbot
sudo apt autoremove
Prüfen: Es wird kein Zertifikat mehr angezeigt, bzw. der Befehl wird nicht mehr gefunden.
sudo certbot certificates
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Open Knowledge (Freies Wissen): Alle Texte stehen unter der freien Lizenz Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International (CC BY-SA 4.0) und können frei gelesen, geteilt und weiterverarbeitet werden.