101 lines
3.0 KiB
Markdown
101 lines
3.0 KiB
Markdown
# STEP 4.1 – TLS-PFLICHT FÜR ALLE BACKEND-SERVICES
|
||
# Status: ABGESCHLOSSEN
|
||
|
||
---
|
||
|
||
## Ziel
|
||
|
||
GAP #4: Alle Backend-Services von HTTP auf HTTPS/TLS umstellen.
|
||
Fail-Start bei fehlendem Zertifikat im Produktionsmodus.
|
||
|
||
## Geänderte Dateien
|
||
|
||
| Datei | Änderung |
|
||
|-------|----------|
|
||
| **aza_tls.py** | NEU – Zentrale TLS-Konfiguration |
|
||
| **todo_server.py** | TLS-Integration via create_ssl_context() |
|
||
| **transcribe_server.py** | TLS-Integration via uvicorn SSL-Kwargs |
|
||
| **backend_main.py** | TLS-Integration via uvicorn SSL-Kwargs |
|
||
|
||
## TLS-Parameter
|
||
|
||
| Parameter | Wert |
|
||
|-----------|------|
|
||
| Minimale TLS-Version | 1.2 (konfigurierbar via ENV) |
|
||
| Maximale TLS-Version | 1.3 |
|
||
| Cipher Suites | ECDHE+AESGCM, ECDHE+CHACHA20, DHE+AESGCM, DHE+CHACHA20 |
|
||
| Ausgeschlossen | aNULL, eNULL, MD5, DSS, RC4, 3DES |
|
||
| Perfect Forward Secrecy | Ja (nur ECDHE/DHE Cipher erlaubt) |
|
||
| DEV-Zertifikat | RSA 4096-bit, SHA-256, 365 Tage, Self-Signed |
|
||
| PROD-Vorbereitung | Pfade über ENV-Variablen konfigurierbar (ACME/Let's Encrypt) |
|
||
|
||
## Umgebungsvariablen
|
||
|
||
| Variable | Default | Beschreibung |
|
||
|----------|---------|--------------|
|
||
| AZA_TLS_CERTFILE | (leer) | Pfad zum Zertifikat (PEM) |
|
||
| AZA_TLS_KEYFILE | (leer) | Pfad zum Private Key (PEM) |
|
||
| AZA_TLS_MIN_VERSION | "1.2" | Minimale TLS-Version ("1.2" oder "1.3") |
|
||
| AZA_TLS_REQUIRE | "1" | "1" = Fail-Start ohne Zertifikat |
|
||
|
||
## Betroffene Server
|
||
|
||
| Server | Port | Typ | TLS-Methode |
|
||
|--------|------|-----|-------------|
|
||
| todo_server | 5111 | stdlib HTTPServer | ssl.wrap_socket() |
|
||
| transcribe_server | 8090 | FastAPI/Uvicorn | uvicorn ssl_certfile/ssl_keyfile |
|
||
| backend_main | 8000 | FastAPI/Uvicorn | uvicorn ssl_certfile/ssl_keyfile |
|
||
| workforce_planner | variabel | FastAPI/Uvicorn | Nicht geändert (kein __main__-Block) |
|
||
|
||
## Testmethode
|
||
|
||
### DEV-Zertifikat erstellen:
|
||
```
|
||
python aza_tls.py
|
||
```
|
||
|
||
### Server starten:
|
||
```
|
||
set AZA_TLS_CERTFILE=dev-cert.pem
|
||
set AZA_TLS_KEYFILE=dev-key.pem
|
||
python backend_main.py
|
||
```
|
||
|
||
### Testen:
|
||
```
|
||
curl https://localhost:8000/health --insecure
|
||
```
|
||
|
||
### Fail-Start testen (ohne Zertifikat):
|
||
```
|
||
set AZA_TLS_REQUIRE=1
|
||
python backend_main.py
|
||
→ Muss mit Fehlermeldung abbrechen
|
||
```
|
||
|
||
### DEV-Modus ohne TLS:
|
||
```
|
||
set AZA_TLS_REQUIRE=0
|
||
python backend_main.py
|
||
→ Startet auf HTTP mit Warnung
|
||
```
|
||
|
||
## Rest-Risiken
|
||
|
||
1. **workforce_planner**: Hat keinen eigenen __main__-Block. TLS muss beim
|
||
Start via uvicorn CLI konfiguriert werden:
|
||
`uvicorn workforce_planner.api.app:app --ssl-certfile=... --ssl-keyfile=...`
|
||
|
||
2. **Self-Signed Zertifikat**: Browser und Clients zeigen Warnungen.
|
||
Für Produktion muss ein CA-signiertes Zertifikat verwendet werden.
|
||
|
||
3. **Client-Seite**: Die Clients (basis14.py, aza_diktat_mixin.py) müssen
|
||
ihre Server-URLs von http:// auf https:// ändern – das ist ein separater
|
||
Schritt.
|
||
|
||
4. **Zertifikatsrotation**: Kein automatischer Erneuerungsmechanismus
|
||
implementiert. Für PROD wird ACME/certbot empfohlen.
|
||
|
||
5. **todo_server PWA**: Service Worker erfordert HTTPS für vollständige
|
||
Funktionalität auf iPhones – dies ist jetzt möglich.
|