10.11. HTTPS – crittografia del trasporto per il server#

Finora tutto è stato HTTP in chiaro sulla porta 80. Chiunque disponga di una cattura di pacchetti tra il browser e la cam può leggere la password del modulo di login, il cookie di sessione che ne ritorna, il JWT nell’header Authorization e i byte JPEG di ogni frame catturato. HTTPS cifra il canale dall’inizio alla fine.

Il workflow del certificato in sé – generare un certificato autofirmato per lo sviluppo, ottenere un certificato firmato da una CA per la produzione, copiare i file sulla cam nel formato corretto – è trattato in Lavorare con i certificati TLS. Questa pagina riguarda l’innesto di un certificato già caricato in microdot.

10.11.1. Costruire il contesto SSL#

ssl.SSLContext è il contenitore della libreria standard per certificato, chiave e opzioni di protocollo. Per un server vuoi PROTOCOL_TLS_SERVER e una catena di certificati caricata dal filesystem della cam:

import ssl

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

I percorsi DER provengono da qualunque workflow tu abbia eseguito nella sezione TLS – autofirmato per lo sviluppo, firmato dalla CA per la produzione. I file non devono per forza stare su /flash; /sdcard funziona altrettanto bene.

10.11.2. Passare il contesto a start_server#

L’unica differenza rispetto alla precedente chiamata a start_server() è l’argomento ssl=ctx e il numero di porta. La porta 443 è quella predefinita per HTTPS, il che significa che i browser non devono digitare :443 – basta https://yard-cam.local/:

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

Per il lato server è tutto. Ogni route esistente – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, la dashboard statica – ora gira su TLS senza altre modifiche al codice.

10.11.4. Cosa non viene trattato qui#

HTTP Strict Transport Security (HSTS), il rinnovo automatico dei certificati, la catena di fiducia della CA sul lato cam per le richieste in uscita e la scelta delle cipher suite vivono tutti nella sezione TLS. L’innesto descritto qui – un solo SSLContext, un solo ssl=ctx – è l’unica parte specifica di microdot.

La barra degli URL della dashboard passa ora da http:// a https:// e il WebSocket da ws:// a wss:// – il JavaScript della dashboard sceglieva già lo schema corretto in base a location.protocol, quindi non servono modifiche lato client.

La cam serve su HTTPS. Il modulo di login, il JWT e i frame catturati sono cifrati durante il transito.