10.11. HTTPS – шифрование транспорта для сервера¶
До сих пор всё работало по обычному HTTP на порту 80. Любой, кто перехватывает пакеты между браузером и камерой, может прочитать пароль из формы входа, сессионную cookie, которая возвращается в ответ, JWT в заголовке Authorization и байты JPEG каждого захваченного кадра. HTTPS шифрует канал от начала до конца.
Сам процесс работы с сертификатами – генерация самоподписанного сертификата для разработки, получение сертификата, подписанного CA, для эксплуатации, копирование файлов на камеру в правильном формате – описан в Работа с сертификатами 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 для эксплуатации. Файлы не обязательно должны быть на /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 и захваченные кадры шифруются при передаче.