10.11. HTTPS – transportkryptering för servern¶
Fram till nu har allt varit vanlig HTTP på port 80. Vem som helst med en paketdump mellan webbläsaren och kameran kan läsa inloggningsformulärets lösenord, sessionscookien som kommer tillbaka från det, JWT:n i Authorization-headern och JPEG-byten för varje fångad bildruta. HTTPS krypterar ledningen från början till slut.
Själva certifikatarbetsflödet – att generera ett självsignerat certifikat för utveckling, skaffa ett CA-signerat certifikat för produktion, kopiera filerna till kameran i rätt format – behandlas i Arbeta med TLS-certifikat. Den här sidan handlar om att koppla in ett redan inläst certifikat i microdot.
10.11.1. Att bygga SSL-kontexten¶
ssl.SSLContext är standardbibliotekets behållare för certifikat, nyckel och protokollalternativ. För en server vill du ha PROTOCOL_TLS_SERVER och en certifikatkedja inläst från kamerans filsystem:
import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('/flash/cert.der', '/flash/key.der')
DER-sökvägarna kommer från vilket arbetsflöde du än körde i TLS-avsnittet – självsignerat för utveckling, CA-signerat för produktion. Filerna behöver inte ligga på /flash; /sdcard fungerar lika bra.
10.11.2. Skicka kontexten till start_server¶
Den enda skillnaden från det tidigare start_server()-anropet är argumentet ssl=ctx och portnumret. Port 443 är HTTPS-standarden, vilket betyder att webbläsare inte behöver ange :443 – bara https://yard-cam.local/ fungerar:
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())
Det var allt för serversidan. Varje befintlig rutt – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, den statiska instrumentpanelen – körs nu över TLS utan några andra kodändringar.
10.11.4. Vad som inte behandlas här¶
HTTP Strict Transport Security (HSTS), automatisk certifikatförnyelse, CA-förtroendekedjan på kamerasidan för utgående begäranden och valet av krypteringssviter lever alla i TLS-avsnittet. Inkopplingen här – en SSLContext, en ssl=ctx – är den enda biten som är specifik för microdot.
Instrumentpanelens URL-fält går nu från http:// till https:// och WebSocketen från ws:// till wss:// – instrumentpanelens JavaScript valde redan rätt schema baserat på location.protocol, så inga klientändringar behövs.
Kameran betjänar över HTTPS. Inloggningsformuläret, JWT:n och de fångade bildrutorna är krypterade under överföring.