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é.