# 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 `.env` konfigurierbar - CA-Download direkt ueber den Browser (`https://:8443/ca.crt`) ## Schnellstart ### 1. Konfiguration anpassen ```bash 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 ```bash docker compose up -d --build ``` ### 3. WebUI oeffnen ``` https://: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://:8443/ca.crt ``` Alternativ liegt die Datei im Projektverzeichnis unter `certs/ca.crt`. --- ### Google Chrome (Desktop) 1. `chrome://settings/security` oeffnen 2. Auf **Zertifikate verwalten** klicken 3. Reiter **Zertifizierungsstellen** waehlen 4. **Importieren** klicken 5. Die heruntergeladene `ca.crt` auswaehlen 6. Haken bei **Diesem Zertifikat zur Identifizierung von Websites vertrauen** setzen 7. Mit **OK** bestaetigen 8. Browser neu starten ### Mozilla Firefox (Desktop) 1. `about:preferences#privacy` oeffnen 2. Runterscrollen zu **Zertifikate** 3. Auf **Zertifikate anzeigen...** klicken 4. Reiter **Zertifizierungsstellen** waehlen 5. **Importieren...** klicken 6. Die heruntergeladene `ca.crt` auswaehlen 7. Haken bei **Dieser CA vertrauen, um Websites zu identifizieren** setzen 8. Mit **OK** bestaetigen ### Android 1. `https://:8443/ca.crt` im Browser oeffnen 2. Die Datei wird heruntergeladen 3. **Einstellungen** > **Sicherheit** > **Verschluesselung und Anmeldedaten** oeffnen 4. **CA-Zertifikat installieren** waehlen 5. Die heruntergeladene `ca.crt` auswaehlen 6. Bei Aufforderung den Geraete-PIN/Passwort eingeben 7. 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) 1. `https://:8443/ca.crt` in **Safari** oeffnen (nicht Chrome!) 2. Es erscheint die Meldung **Profil geladen** -- auf **Schliessen** tippen 3. **Einstellungen** oeffnen 4. Oben erscheint **Profil geladen** -- darauf tippen 5. Auf **Installieren** tippen und den Geraete-Code eingeben 6. Nochmals **Installieren** bestaetigen 7. Danach: **Einstellungen** > **Allgemein** > **Info** > **Zertifikatsvertrauenseinstellungen** 8. Den Schalter neben dem CA-Zertifikat **aktivieren** 9. Mit **Weiter** bestaetigen > **Wichtig:** Schritt 7-9 wird oft vergessen! Ohne die Vertrauenseinstellung unter "Info" ist das Zertifikat zwar installiert, aber nicht aktiv. ### macOS 1. `https://:8443/ca.crt` im Browser oeffnen und herunterladen 2. Doppelklick auf die `ca.crt` -- die **Schluesselbuendverwaltung** oeffnet sich 3. Das Zertifikat wird unter **Anmeldung** hinzugefuegt 4. Doppelklick auf das importierte Zertifikat 5. **Vertrauen** aufklappen 6. **Bei Verwendung dieses Zertifikats** auf **Immer vertrauen** setzen 7. Fenster schliessen und mit Admin-Passwort bestaetigen ### Windows 1. `https://:8443/ca.crt` im Browser oeffnen und herunterladen 2. Doppelklick auf die `ca.crt` 3. Auf **Zertifikat installieren...** klicken 4. **Lokaler Computer** waehlen (fuer alle Benutzer) oder **Aktueller Benutzer** 5. **Alle Zertifikate in folgendem Speicher speichern** waehlen 6. **Durchsuchen** > **Vertrauenswuerdige Stammzertifizierungsstellen** waehlen 7. Mit **OK** / **Weiter** / **Fertig stellen** abschliessen 8. Browser neu starten ### Linux ```bash # 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 ```bash curl -k -u admin:admin123 https://localhost:8443/api/targets ``` ### Neues Ziel hinzufuegen ```bash 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 ```bash 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 ```bash curl -k -u admin:admin123 -X DELETE https://localhost:8443/api/targets/0 ``` ### Nginx neu laden ```bash 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`): ```bash rm -f certs/ca.* certs/server.* docker compose up -d --build ``` ## Lizenz MIT