10.11. HTTPS -- การเข้ารหัสการส่งข้อมูลสำหรับเซิร์ฟเวอร์

จนถึงตอนนี้ทุกอย่างเป็น HTTP แบบธรรมดาบนพอร์ต 80 ใครก็ตามที่ดักจับแพ็กเก็ตระหว่างเบราว์เซอร์และกล้องสามารถอ่านรหัสผ่านจากฟอร์มเข้าสู่ระบบ คุกกี้เซสชันที่ส่งกลับมา JWT ในส่วนหัว Authorization และไบต์ JPEG ของทุกเฟรมที่จับภาพได้ HTTPS เข้ารหัสการสื่อสารตั้งแต่ต้นถึงปลาย

ขั้นตอนการทำงานกับใบรับรอง -- การสร้างใบรับรองที่ลงนามด้วยตนเองสำหรับการพัฒนา การรับใบรับรองที่ลงนามโดย CA สำหรับการใช้งานจริง การคัดลอกไฟล์ลงบนกล้องในรูปแบบที่ถูกต้อง -- ได้กล่าวถึงใน การทำงานกับ TLS certificate หน้านี้เกี่ยวกับ การเสียบใบรับรองที่โหลดแล้วเข้ากับ microdot

10.11.1. การสร้าง SSL context

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. ส่ง context ไปยัง 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, แดชบอร์ดแบบ static -- ตอนนี้ทำงานบน TLS โดยไม่ต้องเปลี่ยนโค้ดอื่น ๆ

10.11.4. สิ่งที่ไม่ได้กล่าวถึงที่นี่

HTTP Strict Transport Security (HSTS) การต่ออายุใบรับรองอัตโนมัติ โซ่ความเชื่อถือ CA ในฝั่งกล้องสำหรับคำขอขาออก และการเลือกชุด cipher ทั้งหมดอยู่ในส่วน TLS การเสียบเพิ่มเติมที่นี่ -- หนึ่ง SSLContext หนึ่ง ssl=ctx -- เป็นส่วนเดียวที่เฉพาะเจาะจงกับ microdot

แถบ URL ของแดชบอร์ดตอนนี้เปลี่ยนจาก http:// เป็น https:// และ WebSocket จาก ws:// เป็น wss:// -- JavaScript ของแดชบอร์ดเลือก scheme ที่ถูกต้องตาม location.protocol อยู่แล้ว ดังนั้นไม่จำเป็นต้องเปลี่ยนแปลง client ใด ๆ

กล้องให้บริการผ่าน HTTPS ฟอร์มเข้าสู่ระบบ JWT และเฟรมที่จับภาพได้ถูกเข้ารหัสระหว่างการส่ง