10.11. HTTPS – criptarea transportului pentru server

Până acum totul a fost HTTP simplu pe portul 80. Oricine are o captură de pachete între browser și cameră poate citi parola din formularul de autentificare, cookie-ul de sesiune care vine de la acesta, JWT-ul din antetul Authorization și octeții JPEG ai fiecărui cadru captat. HTTPS criptează firul de la cap la coadă.

Fluxul de lucru pentru certificate în sine – generarea unui certificat auto-semnat pentru dezvoltare, obținerea unui certificat semnat de o CA pentru producție, copierea fișierelor pe cameră în formatul corect – este tratat în Lucrul cu certificate TLS. Această pagină este despre conectarea unui certificat deja încărcat în microdot.

10.11.1. Construirea contextului SSL

ssl.SSLContext este containerul bibliotecii standard pentru certificat, cheie și opțiuni de protocol. Pentru un server vrei PROTOCOL_TLS_SERVER și un lanț de certificate încărcat din sistemul de fișiere al camerei:

import ssl

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

Căile DER provin din oricare flux de lucru pe care l-ai rulat în secțiunea TLS – auto-semnat pentru dezvoltare, semnat de CA pentru producție. Fișierele nu trebuie să fie pe /flash; /sdcard funcționează la fel de bine.

10.11.2. Transmite contextul către start_server

Singura diferență față de apelul anterior start_server() este argumentul ssl=ctx și numărul portului. Portul 443 este implicit pentru HTTPS, ceea ce înseamnă că browserele nu trebuie să tasteze :443 – doar https://yard-cam.local/ funcționează:

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())

Asta e tot pentru partea de server. Fiecare rută existentă – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, dashboardul static – rulează acum prin TLS fără nicio altă modificare de cod.

10.11.4. Ce nu este tratat aici

HTTP Strict Transport Security (HSTS), reînnoirea automată a certificatelor, lanțul de încredere al CA pe partea camerei pentru cererile de ieșire și alegerea suitelor de cifrare se află toate în secțiunea TLS. Plug-in-ul de aici – un SSLContext, un ssl=ctx – este singura piesă specifică pentru microdot.

Bara de URL a dashboardului trece acum de la http:// la https://, iar WebSocket-ul de la ws:// la wss:// – JavaScriptul dashboardului a ales deja schema corectă pe baza location.protocol, așa că nu sunt necesare modificări la client.

Camera servește prin HTTPS. Formularul de autentificare, JWT-ul și cadrele captate sunt criptate în tranzit.