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