10.11. HTTPS – Transportverschlüsselung für den Server

Bisher war alles einfaches HTTP auf Port 80. Jeder, der einen Paketmitschnitt zwischen Browser und Kamera anfertigt, kann das Passwort des Login-Formulars, das daraufhin zurückkommende Sitzungs-Cookie, das JWT im Authorization-Header und die JPEG-Bytes jedes erfassten Einzelbilds lesen. HTTPS verschlüsselt die Leitung Ende zu Ende.

Der Zertifikats-Workflow selbst – das Erzeugen eines selbstsignierten Zertifikats für die Entwicklung, das Beschaffen eines CA-signierten Zertifikats für die Produktion, das Kopieren der Dateien im richtigen Format auf die Kamera – wird in Arbeiten mit TLS-Zertifikaten behandelt. Auf dieser Seite geht es darum, ein bereits geladenes Zertifikat in microdot einzubinden.

10.11.1. Aufbau des SSL-Kontexts

ssl.SSLContext ist der Container der Standardbibliothek für Zertifikat, Schlüssel und Protokolloptionen. Für einen Server möchten Sie PROTOCOL_TLS_SERVER und eine vom Dateisystem der Kamera geladene Zertifikatskette:

import ssl

ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('/flash/cert.der', '/flash/key.der')

Die DER-Pfade stammen aus dem Workflow, den Sie im TLS-Abschnitt ausgeführt haben – selbstsigniert für die Entwicklung, CA-signiert für die Produktion. Die Dateien müssen nicht auf /flash liegen; /sdcard funktioniert ebenso gut.

10.11.2. Den Kontext an start_server übergeben

Der einzige Unterschied zum früheren start_server()-Aufruf ist das Argument ssl=ctx und die Portnummer. Port 443 ist der HTTPS-Standard, was bedeutet, dass Browser kein :443 eingeben müssen – https://yard-cam.local/ funktioniert einfach:

async def main():
    await asyncio.gather(
        capture_loop(),
        motion_detector(),
        app.start_server(host='0.0.0.0', port=443, ssl=ctx),
    )

asyncio.run(main())

Das war es für die Serverseite. Jede vorhandene Route – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, das statische Dashboard – läuft nun über TLS, ohne dass weitere Codeänderungen nötig sind.

10.11.4. Was hier nicht behandelt wird

HTTP Strict Transport Security (HSTS), die automatische Zertifikatserneuerung, die CA-Vertrauenskette auf der Kameraseite für ausgehende Anfragen und die Wahl der Cipher Suites finden sich alle im TLS-Abschnitt. Das Einbinden hier – ein SSLContext, ein ssl=ctx – ist der einzige Teil, der spezifisch für microdot ist.

Die URL-Leiste des Dashboards wechselt nun von http:// zu https:// und der WebSocket von ws:// zu wss:// – das JavaScript des Dashboards hat das richtige Schema bereits anhand von location.protocol gewählt, sodass keine Client-Änderungen nötig sind.

Die Kamera liefert über HTTPS aus. Das Login-Formular, das JWT und die erfassten Einzelbilder sind während der Übertragung verschlüsselt.