10.11. HTTPS -- تشفير النقل للخادم

حتى الآن كان كل شيء عبر HTTP عادي على المنفذ 80. أي شخص لديه القدرة على التقاط الحزم بين المتصفح والكاميرا يستطيع قراءة كلمة مرور نموذج تسجيل الدخول، وكوكي الجلسة الذي يعود منه، ورمز 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 (HSTS)، والتجديد التلقائي للشهادة، وسلسلة ثقة CA على جانب الكاميرا للطلبات الصادرة، واختيار مجموعات التشفير، كلها موجودة في قسم TLS. أما التوصيل هنا -- SSLContext واحد، و ssl=ctx واحد -- فهو الجزء الوحيد الخاص بـ microdot.

ينتقل شريط عنوان URL في لوحة التحكم الآن من http:// إلى https:// وينتقل WebSocket من ws:// إلى wss:// -- وقد اختارت جافاسكريبت لوحة التحكم بالفعل المخطط الصحيح بناءً على location.protocol، لذا لا حاجة لأي تغييرات في العميل.

تخدم الكاميرا عبر HTTPS. نموذج تسجيل الدخول، ورمز JWT، والإطارات الملتقطة مشفّرة أثناء النقل.