- Session-based login page instead of HTTP Basic Auth - /ca.crt download works without login for easy device access - HTTP port (default 8080) redirects to HTTPS automatically - Nginx access/error log viewer in WebUI - API still supports Basic Auth for curl/scripts - Logout button and log navigation in header Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| app | ||
| certs | ||
| nginx | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| Dockerfile | ||
| README.md | ||
| docker-compose.yml | ||
README.md
HTTPS Reverse Proxy mit selbstsigniertem 100-Jahre-Zertifikat
Ein Docker-basierter HTTPS Reverse Proxy mit eigener CA (Certificate Authority), konfigurierbarer WebUI und REST API.
Features
- Selbstsigniertes SSL-Zertifikat mit eigener CA (100 Jahre gueltig)
- WebUI zur Verwaltung von Proxy-Zielen
- REST API fuer automatisierte Konfiguration
- Domain-basiertes und IP/Port-basiertes Routing
- Host Network Mode (keine Port-Freigabe noetig)
- Alle Einstellungen ueber
.envkonfigurierbar - CA-Download direkt ueber den Browser (
https://<ip>:8443/ca.crt)
Schnellstart
1. Konfiguration anpassen
cp .env.example .env
nano .env
Einstellungen in der .env:
| Variable | Beschreibung | Standard |
|---|---|---|
CERT_COUNTRY |
Land (2-Buchstaben-Code) | DE |
CERT_STATE |
Bundesland | Bavaria |
CERT_CITY |
Stadt | Munich |
CERT_ORG |
Organisation | MyOrganization |
CERT_OU |
Abteilung | IT |
CERT_CN |
Common Name | proxy.local |
CERT_DAYS |
Zertifikat-Gueltigkeit in Tagen | 36500 (~100 Jahre) |
WEBUI_PORT |
Port der WebUI | 8443 |
WEBUI_USERNAME |
Login-Benutzername | admin |
WEBUI_PASSWORD |
Login-Passwort | admin123 |
2. Container starten
docker compose up -d --build
3. WebUI oeffnen
https://<server-ip>:8443
Login mit den Zugangsdaten aus der .env.
CA-Zertifikat installieren
Damit Browser und Geraete dem selbstsignierten Zertifikat vertrauen, muss die CA installiert werden.
CA-Zertifikat herunterladen
Die CA kann direkt ueber den Browser heruntergeladen werden:
https://<server-ip>:8443/ca.crt
Alternativ liegt die Datei im Projektverzeichnis unter certs/ca.crt.
Google Chrome (Desktop)
chrome://settings/securityoeffnen- Auf Zertifikate verwalten klicken
- Reiter Zertifizierungsstellen waehlen
- Importieren klicken
- Die heruntergeladene
ca.crtauswaehlen - Haken bei Diesem Zertifikat zur Identifizierung von Websites vertrauen setzen
- Mit OK bestaetigen
- Browser neu starten
Mozilla Firefox (Desktop)
about:preferences#privacyoeffnen- Runterscrollen zu Zertifikate
- Auf Zertifikate anzeigen... klicken
- Reiter Zertifizierungsstellen waehlen
- Importieren... klicken
- Die heruntergeladene
ca.crtauswaehlen - Haken bei Dieser CA vertrauen, um Websites zu identifizieren setzen
- Mit OK bestaetigen
Android
https://<server-ip>:8443/ca.crtim Browser oeffnen- Die Datei wird heruntergeladen
- Einstellungen > Sicherheit > Verschluesselung und Anmeldedaten oeffnen
- CA-Zertifikat installieren waehlen
- Die heruntergeladene
ca.crtauswaehlen - Bei Aufforderung den Geraete-PIN/Passwort eingeben
- Dem Zertifikat einen Namen geben und mit OK bestaetigen
Hinweis: Der genaue Pfad variiert je nach Android-Version und Hersteller. Suche in den Einstellungen nach "Zertifikat" falls der Pfad abweicht.
iPhone / iPad (iOS / iPadOS)
https://<server-ip>:8443/ca.crtin Safari oeffnen (nicht Chrome!)- Es erscheint die Meldung Profil geladen -- auf Schliessen tippen
- Einstellungen oeffnen
- Oben erscheint Profil geladen -- darauf tippen
- Auf Installieren tippen und den Geraete-Code eingeben
- Nochmals Installieren bestaetigen
- Danach: Einstellungen > Allgemein > Info > Zertifikatsvertrauenseinstellungen
- Den Schalter neben dem CA-Zertifikat aktivieren
- Mit Weiter bestaetigen
Wichtig: Schritt 7-9 wird oft vergessen! Ohne die Vertrauenseinstellung unter "Info" ist das Zertifikat zwar installiert, aber nicht aktiv.
macOS
https://<server-ip>:8443/ca.crtim Browser oeffnen und herunterladen- Doppelklick auf die
ca.crt-- die Schluesselbuendverwaltung oeffnet sich - Das Zertifikat wird unter Anmeldung hinzugefuegt
- Doppelklick auf das importierte Zertifikat
- Vertrauen aufklappen
- Bei Verwendung dieses Zertifikats auf Immer vertrauen setzen
- Fenster schliessen und mit Admin-Passwort bestaetigen
Windows
https://<server-ip>:8443/ca.crtim Browser oeffnen und herunterladen- Doppelklick auf die
ca.crt - Auf Zertifikat installieren... klicken
- Lokaler Computer waehlen (fuer alle Benutzer) oder Aktueller Benutzer
- Alle Zertifikate in folgendem Speicher speichern waehlen
- Durchsuchen > Vertrauenswuerdige Stammzertifizierungsstellen waehlen
- Mit OK / Weiter / Fertig stellen abschliessen
- Browser neu starten
Linux
# Debian/Ubuntu
sudo cp ca.crt /usr/local/share/ca-certificates/proxy-ca.crt
sudo update-ca-certificates
# RHEL/CentOS/Fedora
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/proxy-ca.crt
sudo update-ca-trust
# Arch Linux
sudo cp ca.crt /etc/ca-certificates/trust-source/anchors/proxy-ca.crt
sudo trust extract-compat
Hinweis: Firefox unter Linux verwendet einen eigenen Zertifikatsspeicher. Die CA muss dort separat importiert werden (siehe Firefox-Anleitung oben).
API-Nutzung
Alle API-Endpunkte erfordern HTTP Basic Auth.
Alle Ziele auflisten
curl -k -u admin:admin123 https://localhost:8443/api/targets
Neues Ziel hinzufuegen
curl -k -u admin:admin123 -X POST https://localhost:8443/api/targets \
-H "Content-Type: application/json" \
-d '{
"name": "mein-webserver",
"target_host": "192.168.1.50",
"target_port": 80,
"target_scheme": "http",
"listen_port": 9443,
"domains": [
{"domain": "app.example.local", "port": 443}
]
}'
Ziel aktualisieren
curl -k -u admin:admin123 -X PUT https://localhost:8443/api/targets/0 \
-H "Content-Type: application/json" \
-d '{"name": "updated", "target_host": "10.0.0.5", "target_port": 3000, "enabled": true}'
Ziel loeschen
curl -k -u admin:admin123 -X DELETE https://localhost:8443/api/targets/0
Nginx neu laden
curl -k -u admin:admin123 -X POST https://localhost:8443/api/reload
Verzeichnisstruktur
.
├── .env # Konfiguration (nicht im Git)
├── .env.example # Konfigurationsvorlage
├── Dockerfile
├── docker-compose.yml
├── app/
│ ├── app.py # Flask App (WebUI + API)
│ ├── requirements.txt
│ └── templates/
│ └── index.html
├── certs/ # Generierte Zertifikate (nicht im Git)
│ ├── ca.crt # CA-Zertifikat
│ ├── ca.key # CA Private Key
│ ├── server.crt # Server-Zertifikat
│ ├── server.key # Server Private Key
│ └── generate-certs.sh # Generierungsskript
├── data/ # Proxy-Konfiguration (nicht im Git)
│ └── proxy_config.json
└── nginx/
├── nginx.conf
└── entrypoint.sh
Zertifikate neu generieren
Falls die Zertifikate neu generiert werden sollen (z.B. nach Aenderung der .env):
rm -f certs/ca.* certs/server.*
docker compose up -d --build
Lizenz
MIT