10.11. HTTPS – шифрування транспорту для сервера

До цього моменту все передавалось через звичайний HTTP на порту 80. Будь-хто, хто перехопить пакети між браузером і камерою, зможе прочитати пароль з форми входу, сесійний cookie, що повертається у відповідь, JWT у заголовку Authorization і JPEG-байти кожного захопленого кадру. HTTPS шифрує передачу даних від початку до кінця.

Сам процес роботи із сертифікатами — генерація самопідписаного сертифіката для розробки, отримання сертифіката від CA для production, копіювання файлів на камеру в правильному форматі — описано в Робота з TLS-сертифікатами. Ця сторінка присвячена підключенню вже завантаженого сертифіката до microdot.

10.11.1. Побудова SSL-контексту

ssl.SSLContext — це контейнер стандартної бібліотеки для сертифіката, ключа та параметрів протоколу. Для сервера вам потрібен PROTOCOL_TLS_SERVER і ланцюжок сертифікатів, завантажений із файлової системи камери:

import ssl

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

Шляхи DER беруться з того робочого процесу, який ви використовували в розділі TLS — самопідписані для розробки, підписані CA для production. Файли не обов’язково мають бути на /flash; /sdcard так само підходить.

10.11.2. Передача контексту до start_server

Єдина відмінність від попереднього виклику start_server() — аргумент ssl=ctx і номер порту. Порт 443 — це стандарт HTTPS, тобто браузерам не потрібно вводити :443 — достатньо просто 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())

Це все, що потрібно на стороні сервера. Усі існуючі маршрути — /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, статична панель керування — тепер працюватимуть через TLS без будь-яких інших змін у коді.

10.11.4. Що тут не розглядається

HTTP Strict Transport Security (HSTS), автоматичне оновлення сертифікатів, ланцюжок довіри CA на стороні камери для вихідних запитів та вибір наборів шифрів — все це розглядається в розділі TLS. Підключення тут — один SSLContext, один ssl=ctx — є єдиною частиною, специфічною для microdot.

Рядок URL-адреси панелі керування тепер змінюється з http:// на https://, а WebSocket — з ws:// на wss:// — клієнтський JavaScript панелі керування вже обирає правильну схему на основі location.protocol, тому зміни на стороні клієнта не потрібні.

Камера обслуговує запити через HTTPS. Форма входу, JWT і захоплені кадри зашифровані під час передачі.