HTTPS mit Certbot¶
Dokumenttyp: Developer Playbook
Status: Draft v0.2
Stand: 2026-06-30
Prinzip: Allgemeine Anleitung mit Praxisbeispiel aus Immohai
Ziel¶
Dieses Dokument erklärt, warum HTTPS für Webanwendungen wichtig ist und welche Rolle Certbot und Let's Encrypt dabei spielen.
Die konkrete Schritt-für-Schritt-Einrichtung von HTTPS für Domains und Subdomains wird im Kapitel 06 Veröffentlichung beschrieben.
Kurz erklärt¶
HTTPS ist die sichere Variante von HTTP.
HTTP ist unverschlüsselt.
HTTPS verschlüsselt die Verbindung zwischen Browser und Server.
Beispiel:
http://example.com → unverschlüsselt
https://example.com → verschlüsselt
Für öffentlich erreichbare Webanwendungen sollte HTTPS immer verwendet werden.
Warum HTTPS wichtig ist¶
HTTPS ist heute Standard für öffentliche Websites und Webapps.
Es schützt:
- Daten zwischen Browser und Server
- Login-Informationen
- Formulareingaben
- Session-Cookies
- API-Anfragen
- Vertrauen der Nutzerinnen und Nutzer
Ohne HTTPS zeigen moderne Browser häufig Warnungen an.
Grundprinzip¶
Eine verschlüsselte Verbindung braucht ein Zertifikat.
Dieses Zertifikat bestätigt, dass eine Domain zu einem bestimmten Server gehört.
Vereinfacht:
Browser
↓
https://app.example.com
↓
Server zeigt gültiges Zertifikat
↓
Browser vertraut der Verbindung
↓
Daten werden verschlüsselt übertragen
HTTP und HTTPS¶
| Begriff | Bedeutung |
|---|---|
| HTTP | unverschlüsselte Verbindung |
| HTTPS | verschlüsselte Verbindung |
| TLS | technisches Verschlüsselungsprotokoll hinter HTTPS |
| Zertifikat | Nachweis, dass eine Domain gültig abgesichert ist |
| Zertifizierungsstelle | Stelle, die Zertifikate ausstellt |
Der frühere Begriff SSL wird oft noch verwendet. Technisch ist heute meistens TLS gemeint.
Im Alltag wird trotzdem häufig von SSL-Zertifikat gesprochen.
Let's Encrypt¶
Let's Encrypt ist eine kostenlose Zertifizierungsstelle.
Sie stellt HTTPS-Zertifikate für Domains aus.
Vorteile:
- kostenlos
- weit verbreitet
- automatisierbar
- von Browsern anerkannt
- gut mit Nginx kombinierbar
Für private und kleinere professionelle Projekte ist Let's Encrypt meistens die beste Startlösung.
Certbot¶
Certbot ist ein Werkzeug auf dem Server.
Certbot übernimmt die praktische Einrichtung der Let's-Encrypt-Zertifikate.
Certbot kann:
- Zertifikate bei Let's Encrypt beantragen.
- Domains validieren.
- Nginx automatisch anpassen.
- HTTP auf HTTPS umleiten.
- Zertifikate automatisch erneuern.
Ohne Certbot müsste man Zertifikate manuell erstellen, installieren und erneuern.
Das wäre fehleranfällig.
Certbot mit Nginx¶
Für Nginx wird das Certbot-Nginx-Plugin verwendet.
Installation:
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
Allgemeines Muster:
sudo certbot --nginx -d app.example.com
Für App und Dokumentation:
sudo certbot --nginx -d app.example.com -d docs.app.example.com
Certbot liest dabei die vorhandene Nginx-Konfiguration und ergänzt die HTTPS-Konfiguration.
Voraussetzungen für Certbot¶
Vor dem Ausführen von Certbot müssen diese Punkte erfüllt sein:
- Domain ist registriert.
- DNS zeigt auf die öffentliche Server-IP.
- Nginx ist installiert.
- Nginx-Konfiguration funktioniert über HTTP.
- Port
80ist öffentlich erreichbar. - Firewall erlaubt HTTP und HTTPS.
- Die gewünschte Domain ist in Nginx als
server_nameeingetragen.
DNS prüfen:
nslookup app.example.com
HTTP prüfen:
curl -I http://app.example.com
Nginx prüfen:
sudo nginx -t
Firewall prüfen:
sudo ufw status verbose
Warum Certbot erst nach Nginx kommt¶
Certbot mit Nginx-Plugin arbeitet mit der Nginx-Konfiguration.
Deshalb muss Nginx vorher grundsätzlich funktionieren.
Die typische Reihenfolge ist:
1. DNS einrichten
2. DNS prüfen
3. Docker-Dienst lokal starten
4. Nginx Reverse Proxy einrichten
5. HTTP öffentlich testen
6. Certbot ausführen
7. HTTPS testen
8. automatische Erneuerung testen
Wenn DNS oder HTTP noch nicht funktionieren, schlägt Certbot häufig fehl.
HTTP-zu-HTTPS-Weiterleitung¶
Nach erfolgreicher Einrichtung sollte HTTP automatisch auf HTTPS weiterleiten.
Beispiel:
http://app.example.com
↓
https://app.example.com
Das ist wichtig, weil Nutzer oft nicht bewusst https:// eingeben.
Prüfen:
curl -I http://app.example.com
Erwartung:
301 Moved Permanently
oder eine vergleichbare Weiterleitung auf HTTPS.
Zertifikatserneuerung¶
Let's-Encrypt-Zertifikate sind zeitlich begrenzt gültig.
Certbot richtet normalerweise eine automatische Erneuerung ein.
Test:
sudo certbot renew --dry-run
Erwartung:
Congratulations, all simulated renewals succeeded
Dieser Test sollte nach der Einrichtung immer durchgeführt werden.
Zertifikate anzeigen¶
sudo certbot certificates
Diese Ausgabe zeigt:
- Zertifikatsnamen
- enthaltene Domains
- Ablaufdatum
- Speicherort der Zertifikate
Wichtig:
Private Keys und Zertifikatsdateien werden nicht in Git gespeichert und nicht in Dokumentation kopiert.
Sicherheit¶
HTTPS schützt die Verbindung zwischen Browser und Server.
HTTPS ersetzt aber keine allgemeine Systemsicherheit.
Zusätzlich wichtig bleiben:
- sichere Passwörter
- SSH-Keys
- Firewall
- regelmäßige Updates
- keine Secrets in Git
- sichere
.env-Dateien - Datenbankzugriffe absichern
- Backups
Praxisbeispiel Immohai¶
Im Praxisbeispiel sind HTTPS und Certbot bereits eingerichtet.
Aktive HTTPS-URLs:
https://playbook.ohaisoft.com
https://immohai.ohaisoft.com
https://docs.immohai.ohaisoft.com
Eingesetzte Komponenten:
| Thema | Entscheidung |
|---|---|
| Domain | ohaisoft.com |
| DNS | IONOS |
| Server | Hetzner Cloud |
| Reverse Proxy | Nginx |
| HTTPS | Let's Encrypt |
| Tool | Certbot |
| App | https://immohai.ohaisoft.com |
| Immohai-Doku | https://docs.immohai.ohaisoft.com |
| Developer Playbook | https://playbook.ohaisoft.com |
Certbot Renewal wurde getestet:
sudo certbot renew --dry-run
Ergebnis:
Congratulations, all simulated renewals succeeded
Unterschied zur Veröffentlichung¶
Dieses Kapitel erklärt HTTPS, Certbot und Let's Encrypt als Server-Software.
Die konkrete Einrichtung für Domains und Subdomains wird im Kapitel 06 Veröffentlichung dokumentiert:
setup/06-veroeffentlichung/
├── 00-uebersicht.md
├── 01-domain-und-dns.md
├── 02-port-strategie.md
├── 03-nginx-reverse-proxy.md
├── 04-https-mit-certbot.md
├── 05-app-und-doku-veroeffentlichen.md
└── 06-veroeffentlichung-checkliste.md
Dort wird Schritt für Schritt beschrieben:
- welche Domains verwendet werden,
- wie DNS geprüft wird,
- wie Nginx vorbereitet wird,
- wie Certbot ausgeführt wird,
- wie HTTPS getestet wird,
- wie die automatische Erneuerung geprüft wird.
Typische Fehler¶
| Fehler | Ursache | Lösung |
|---|---|---|
| Certbot Timeout | Port 80 ist nicht erreichbar |
Firewall, DNS und Nginx prüfen |
| Domain wird nicht gefunden | DNS zeigt nicht auf Server | nslookup ausführen |
| Nginx-Plugin fehlt | Paket python3-certbot-nginx fehlt |
Paket installieren |
| Zertifikat für falsche Domain | falsche -d-Angabe |
Certbot mit richtiger Domain ausführen |
| Browser zeigt Warnung | Zertifikat fehlt oder passt nicht | Zertifikat prüfen |
| HTTP leitet nicht auf HTTPS weiter | Weiterleitung nicht aktiviert | Nginx-Konfiguration prüfen |
| Renewal schlägt fehl | Domain-Challenge nicht erreichbar | sudo certbot renew --dry-run prüfen |
| Private Keys wurden kopiert | Sicherheitsverstoß | Schlüssel entfernen und Zertifikat erneuern |
Best Practices¶
- HTTPS vor produktiver Nutzung einrichten.
- Certbot mit Nginx-Plugin verwenden.
- DNS vor Certbot immer prüfen.
- HTTP vor Certbot testen.
- HTTP auf HTTPS weiterleiten.
- Nach Einrichtung
sudo certbot renew --dry-runausführen. - Zertifikate regelmäßig prüfen.
- Keine Zertifikate oder Private Keys in Git speichern.
- Keine Secrets in Markdown-Dateien dokumentieren.
- HTTPS-Status in der Projektdokumentation festhalten.
Checkliste¶
- [ ] Unterschied zwischen HTTP und HTTPS verstanden
- [ ] Rolle von Zertifikaten verstanden
- [ ] Rolle von Let's Encrypt verstanden
- [ ] Rolle von Certbot verstanden
- [ ] Nginx als Voraussetzung verstanden
- [ ] DNS vor Certbot geprüft
- [ ] HTTP vor Certbot geprüft
- [ ] Certbot installiert
- [ ] Certbot-Nginx-Plugin installiert
- [ ] HTTPS eingerichtet
- [ ] HTTP-zu-HTTPS-Weiterleitung aktiviert
- [ ] HTTPS im Browser getestet
- [ ] automatische Erneuerung mit
sudo certbot renew --dry-rungetestet - [ ] keine Zertifikate oder Private Keys in Git gespeichert