Zum Inhalt

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:

  1. Zertifikate bei Let's Encrypt beantragen.
  2. Domains validieren.
  3. Nginx automatisch anpassen.
  4. HTTP auf HTTPS umleiten.
  5. 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 80 ist öffentlich erreichbar.
  • Firewall erlaubt HTTP und HTTPS.
  • Die gewünschte Domain ist in Nginx als server_name eingetragen.

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-run ausfü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-run getestet
  • [ ] keine Zertifikate oder Private Keys in Git gespeichert