TLS bảo vệ một đoạn đường, không bảo vệ cả hành trình
TLS làm ba việc, và chỉ ba việc, giữa hai điểm cuối của một kết nối:
- Bí mật — người ở giữa không đọc được nội dung.
- Toàn vẹn — người ở giữa không sửa được nội dung mà không bị phát hiện.
- Xác thực server — client biết mình đang nói với đúng host trong chứng chỉ.
Ba việc đó đủ để giải quyết mối đe doạ "ai đó ngồi trên cùng Wi-Fi". Chúng không giải quyết được ba nhóm vấn đề mà người ta thường tưởng chúng giải quyết:
(1) TLS không bảo vệ dữ liệu ở hai đầu. Nó bảo vệ đường truyền. Dữ liệu đi ra khỏi TLS ở load balancer, rồi vào log của nó; đi ra ở API gateway, rồi vào trace; đi tới trình duyệt, rồi vào localStorage. Mỗi điểm kết thúc TLS là một chỗ dữ liệu ở dạng plaintext.
(2) TLS không che URL khỏi mọi con mắt. Nội dung được mã hoá, nhưng URL đi vào access log của server, log của proxy, Referer khi người dùng bấm sang trang khác, history của trình duyệt, và báo cáo của Sentry. Đó là lý do một token trong query string là một lỗi kể cả khi kết nối là HTTPS — và là lý do luồng Implicit ở bài oauth-flow-choice bị loại bỏ.
(3) TLS không xác thực client, trừ khi bạn cấu hình mTLS. Chứng chỉ chứng minh server là ai. Nó không nói gì về client.
Và ba thứ đáng cấu hình mà không phải "bật TLS":
| Cấu hình | Chống gì | Cái bẫy |
|---|---|---|
HSTS với includeSubDomains | Kết nối HTTP đầu tiên bị chặn và hạ cấp | max-age quá dài lúc thử nghiệm là không lùi được |
| TLS 1.2 tối thiểu, ưu tiên 1.3 | Bộ mã hoá và giao thức cũ có lỗ hổng đã biết | Client cũ mất kết nối, cần đo trước |
| Kiểm chứng chỉ ở phía gọi ra | MITM trên chính lời gọi của bạn tới bên thứ ba | Rất hay bị tắt để "cho chạy được trên dev" |
Dòng thứ ba đáng nhấn: ServerCertificateCustomValidationCallback = (_,_,_,_) => true là dòng code tắt hoàn toàn việc xác thực server cho mọi lời gọi ra ngoài. Nó được thêm vào để một chứng chỉ tự ký ở dev hoạt động, và nó thường ở lại.
Bình luận
Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.
Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.
Đang tải bình luận…