10.11. HTTPS – siirtotien salaus palvelimelle

Tähän asti kaikki on ollut tavallista HTTP:tä portissa 80. Kuka tahansa, joka kaappaa paketteja selaimen ja kameran väliltä, voi lukea kirjautumislomakkeen salasanan, siltä palaavan istuntoevästeen, Authorization-otsakkeen JWT:n ja jokaisen kaapatun kehyksen JPEG-tavut. HTTPS salaa siirtotien päästä päähän.

Itse varmenneprosessi – itse allekirjoitetun varmenteen luominen kehitystä varten, CA:n allekirjoittaman varmenteen hankkiminen tuotantoon, tiedostojen kopioiminen kameraan oikeassa muodossa – käsitellään kohdassa TLS-varmenteiden kanssa työskentely. Tämä sivu käsittelee jo ladatun varmenteen kytkemistä microdotiin.

10.11.1. SSL-kontekstin rakentaminen

ssl.SSLContext on standardikirjaston säiliö varmenteelle, avaimelle ja protokollavalinnoille. Palvelinta varten haluat PROTOCOL_TLS_SERVER-arvon ja kameran tiedostojärjestelmästä ladatun varmenneketjun:

import ssl

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

DER-polut tulevat siitä prosessista, jonka ajoit TLS-osiossa – itse allekirjoitettu kehitystä varten, CA:n allekirjoittama tuotantoon. Tiedostojen ei tarvitse olla /flash-polussa; /sdcard toimii yhtä hyvin.

10.11.2. Välitä konteksti start_server-kutsulle

Ainoa ero aiempaan start_server()-kutsuun on ssl=ctx-argumentti ja porttinumero. Portti 443 on HTTPS:n oletus, mikä tarkoittaa, että selainten ei tarvitse kirjoittaa :443 – pelkkä https://yard-cam.local/ toimii:

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

Siinä kaikki palvelimen osalta. Jokainen olemassa oleva reitti – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control ja staattinen koontinäyttö – toimii nyt TLS:n yli ilman muita koodimuutoksia.

10.11.4. Mitä tässä ei käsitellä

HTTP Strict Transport Security (HSTS), varmenteen automaattinen uusiminen, CA:n luottamusketju kameran puolella ulospäin lähteville pyynnöille ja salausmenetelmien valinta kuuluvat kaikki TLS-osioon. Tässä esitelty liitäntä – yksi SSLContext, yksi ssl=ctx – on ainoa osa, joka on nimenomaan microdotille ominainen.

Koontinäytön URL-palkki vaihtuu nyt muodosta http:// muotoon https:// ja WebSocket muodosta ws:// muotoon wss:// – koontinäytön JavaScript valitsi jo oikean skeeman location.protocol-arvon perusteella, joten asiakaspuolen muutoksia ei tarvita.

Kamera palvelee HTTPS:n yli. Kirjautumislomake, JWT ja kaapatut kehykset ovat salattuja siirron aikana.