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 Strict Transport Security (HSTS), חידוש אוטומטי של תעודות, שרשרת האמון של ה-CA בצד המצלמה עבור בקשות יוצאות, והבחירה של חבילות הצפנה (cipher suites) – כולם נמצאים בקטע ה-TLS. החיבור כאן – SSLContext אחד, ssl=ctx אחד – הוא החלק היחיד שספציפי ל-microdot.

שורת הכתובת של לוח המחוונים עוברת כעת מ-http:// ל-https:// וה-WebSocket מ-ws:// ל-wss:// – ה-JavaScript של לוח המחוונים כבר בחר בסכמה הנכונה על בסיס location.protocol, כך שאין צורך בשינויי לקוח.

המצלמה מגישה מעל HTTPS. טופס ההתחברות, ה-JWT, והפריימים שנלכדו מוצפנים בתעבורה.