10.11. HTTPS – szyfrowanie transportu dla serwera¶
Do tej pory wszystko działało jako zwykły HTTP na porcie 80. Każdy, kto przechwyci pakiety między przeglądarką a kamerą, może odczytać hasło z formularza logowania, zwracane przez niego ciasteczko sesji, token JWT w nagłówku Authorization oraz bajty JPEG każdej przechwyconej ramki. HTTPS szyfruje łącze od początku do końca.
Sam przepływ pracy z certyfikatami – generowanie samopodpisanego certyfikatu na potrzeby programistyczne, uzyskiwanie certyfikatu podpisanego przez CA do zastosowań produkcyjnych, kopiowanie plików na kamerę w odpowiednim formacie – jest opisany w Praca z certyfikatami TLS. Ta strona dotyczy podłączenia już załadowanego certyfikatu do microdot.
10.11.1. Budowanie kontekstu SSL¶
ssl.SSLContext to kontener biblioteki standardowej na certyfikat, klucz i opcje protokołu. Dla serwera potrzebujesz PROTOCOL_TLS_SERVER oraz łańcucha certyfikatów wczytanego z systemu plików kamery:
import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('/flash/cert.der', '/flash/key.der')
Ścieżki DER pochodzą z tego przepływu pracy, który uruchomiłeś w sekcji TLS – samopodpisany na potrzeby programistyczne, podpisany przez CA do zastosowań produkcyjnych. Pliki nie muszą znajdować się na /flash; /sdcard sprawdza się równie dobrze.
10.11.2. Przekazanie kontekstu do start_server¶
Jedyną różnicą względem wcześniejszego wywołania start_server() jest argument ssl=ctx oraz numer portu. Port 443 jest domyślnym portem HTTPS, co oznacza, że przeglądarki nie muszą wpisywać :443 – wystarczy 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 wszystko po stronie serwera. Każda istniejąca trasa – /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, statyczny pulpit – działa teraz przez TLS bez żadnych innych zmian w kodzie.
10.11.4. Czego tu nie omówiono¶
HTTP Strict Transport Security (HSTS), automatyczne odnawianie certyfikatów, łańcuch zaufania CA po stronie kamery dla żądań wychodzących oraz wybór zestawów szyfrów – wszystko to znajduje się w sekcji TLS. Podłączenie opisane tutaj – jeden SSLContext, jeden ssl=ctx – to jedyny element specyficzny dla microdot.
Pasek adresu pulpitu zmienia się teraz z http:// na https://, a WebSocket z ws:// na wss:// – JavaScript pulpitu już wybrał właściwy schemat na podstawie location.protocol, więc po stronie klienta nie są potrzebne żadne zmiany.
Kamera obsługuje połączenia przez HTTPS. Formularz logowania, token JWT oraz przechwycone ramki są szyfrowane podczas przesyłania.