https-proxy-with-self-signe.../README.md

7.0 KiB

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://<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)

  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://<server-ip>: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://<server-ip>: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://<server-ip>: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://<server-ip>: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

# 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