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 และเฟรมที่จับภาพได้ถูกเข้ารหัสระหว่างการส่ง