10.11. HTTPS -- mã hóa truyền tải cho server

Cho đến nay mọi thứ đều là HTTP thuần trên port 80. Bất kỳ ai có thể bắt gói tin giữa trình duyệt và cam đều có thể đọc mật khẩu từ form đăng nhập, session cookie trả về từ đó, JWT trong header Authorization, và các byte JPEG của mỗi khung hình đã chụp. HTTPS mã hóa toàn bộ đường truyền từ đầu đến cuối.

Quy trình làm việc với chứng chỉ -- tạo chứng chỉ tự ký cho môi trường phát triển, lấy chứng chỉ do CA ký cho môi trường sản xuất, sao chép các tệp lên cam theo đúng định dạng -- được đề cập trong Làm việc với chứng chỉ TLS. Trang này nói về cách gắn một chứng chỉ đã được tải vào microdot.

10.11.1. Xây dựng SSL context

ssl.SSLContext là container của thư viện chuẩn chứa chứng chỉ, khóa, và các tùy chọn giao thức. Đối với server bạn cần PROTOCOL_TLS_SERVER và một chuỗi chứng chỉ được tải từ hệ thống tệp của cam:

import ssl

ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain('/flash/cert.der', '/flash/key.der')

Các đường dẫn DER đến từ quy trình làm việc bạn đã chạy trong phần TLS -- tự ký cho dev, CA ký cho production. Các tệp không nhất thiết phải trên /flash; /sdcard cũng hoạt động tốt.

10.11.2. Truyền context vào start_server

Điểm khác biệt duy nhất so với lệnh gọi start_server() trước đó là đối số ssl=ctx và số port. Port 443 là mặc định của HTTPS, nghĩa là trình duyệt không cần gõ :443 -- chỉ cần https://yard-cam.local/ là đủ:

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())

Vậy là xong phía server. Mọi route hiện có -- /status, /snapshot.jpg, /stream.jpg, /config, /events, /control, dashboard tĩnh -- giờ chạy qua TLS mà không cần thay đổi thêm bất kỳ dòng code nào.

10.11.4. Những gì không được đề cập ở đây

HTTP Strict Transport Security (HSTS), tự động gia hạn chứng chỉ, chuỗi CA trust trên phía cam cho các yêu cầu đi ra ngoài, và việc lựa chọn cipher suite đều nằm trong phần TLS. Phần tích hợp ở đây -- một SSLContext, một ssl=ctx -- là phần duy nhất đặc trưng cho microdot.

Thanh URL của dashboard giờ chuyển từ http:// sang https:// và WebSocket từ ws:// sang wss:// -- JavaScript của dashboard đã tự chọn scheme đúng dựa trên location.protocol, nên không cần thay đổi gì ở phía client.

Cam phục vụ qua HTTPS. Form đăng nhập, JWT, và các khung hình đã chụp được mã hóa trong quá trình truyền tải.