10.11. HTTPS – šifrování přenosu pro server#
Doposud bylo vše prosté HTTP na portu 80. Kdokoli s odposlechem paketů mezi prohlížečem a kamerou si může přečíst heslo z přihlašovacího formuláře, session cookie, které se z něj vrací, JWT v hlavičce Authorization i JPEG bajty každého zachyceného snímku. HTTPS šifruje přenos od začátku do konce.
Samotný postup s certifikáty – generování self-signed certifikátu pro vývoj, získání certifikátu podepsaného CA pro produkci, zkopírování souborů na kameru ve správném formátu – je popsán v Práce s TLS certifikáty. Tato stránka je o zapojení již načteného certifikátu do microdotu.
10.11.1. Sestavení SSL kontextu#
ssl.SSLContext je kontejner standardní knihovny pro certifikát, klíč a volby protokolu. Pro server chcete PROTOCOL_TLS_SERVER a řetězec certifikátů načtený ze souborového systému kamery:
import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('/flash/cert.der', '/flash/key.der')
Cesty k DER souborům pocházejí z toho postupu, který jste v sekci TLS spustili – self-signed pro vývoj, podepsaný CA pro produkci. Soubory nemusí být na /flash; /sdcard funguje stejně dobře.
10.11.2. Předejte kontext do start_server#
Jediný rozdíl oproti dřívějšímu volání start_server() je argument ssl=ctx a číslo portu. Port 443 je výchozí pro HTTPS, což znamená, že prohlížeče nemusí psát :443 – stačí 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())
To je vše na straně serveru. Každá existující cesta – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, statický dashboard – nyní běží přes TLS bez jakýchkoli dalších změn kódu.
10.11.4. Co zde není pokryto#
HTTP Strict Transport Security (HSTS), automatické obnovování certifikátů, řetězec důvěry CA na straně kamery pro odchozí požadavky a volba šifrovacích sad – to vše žije v sekci TLS. Zde popsané zapojení – jeden SSLContext, jedno ssl=ctx – je jediná část, která je specifická pro microdot.
Adresní řádek dashboardu nyní přechází z http:// na https:// a WebSocket z ws:// na wss:// – JavaScript dashboardu už zvolil správné schéma na základě location.protocol, takže žádné změny na straně klienta nejsou potřeba.
Kamera obsluhuje přes HTTPS. Přihlašovací formulář, JWT a zachycené snímky jsou při přenosu šifrované.