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, והפריימים שנלכדו מוצפנים בתעבורה.