TLS di chuyển bên trong kênh điều khiển, không phải toàn bộ đường hầm
Các bên trao đổi gói tin của riêng mình, và TLS chạy bên trong trao đổi điều khiển. Một proxy hiểu HTTPS không biết đây là loại lưu lượng gì.
Thấy từ TLS trong mô tả VPN và kết luận rằng một proxy web sẽ hiểu lưu lượng này là một lối tắt phổ biến. Bên trong giao thức này, các bên trao đổi gói tin của riêng mình, và TLS chạy như một phần của một kênh trong trao đổi đó. Phần tải trọng mà người dùng quan tâm đi theo một định dạng thông điệp khác, và đó là lý do hai thứ này không bao giờ khớp với một phiên HTTPS thông thường.
Bao bì đến trước
Mỗi gói tin đường hầm bắt đầu bằng tiêu đề của chính giao thức: loại thông điệp, mã định danh khóa và, trên phương tiện truyền luồng byte, tiền tố độ dài đánh dấu nơi gói tin kết thúc. Một người đọc không phân tích bao bì đó không thể biết trường tiếp theo bắt đầu ở đâu.
outer transport (UDP datagram or TCP stream)
-> OpenVPN header (opcode, key id, length where needed)
-> control message (reliability wrapper, TLS exchange)
-> data message (protected inner packet)
Bản phác đó là một bản đồ chứ không phải bảng byte, vì các trường chính xác phụ thuộc vào loại thông điệp, mặc dù octet đầu tiên luôn đóng gói mã thao tác và mã định danh khóa cùng nhau. Đoán loại thông điệp từ số cổng là cách các bộ giải mã cuối cùng đặt tên sai cho những gì chúng thấy. Thứ tự mới là điều quan trọng để chẩn đoán: truyền tải, rồi bao bì giao thức, rồi một trong hai loại công việc. Đọc bao bì trước khi hình thành ý kiến về những gì tiếp theo. Một bộ giải mã bắt đầu sai chỗ tạo ra sự vô nghĩa đầy tự tin.
Lớp tin cậy thuộc về giao thức
Các thông điệp điều khiển cần việc giao nhận có thứ tự và được xác nhận, và giao thức tự cung cấp điều đó bằng xác nhận và truyền lại. Một xác nhận có thể đến như thông điệp riêng hoặc đi cùng một thông điệp điều khiển khác, khiến các dấu vết trông không đều đối với bất kỳ ai mong đợi một lần trao đổi sạch.
Lợi ích là bắt tay TLS có được vật mang tin cậy ngay cả khi truyền tải bên ngoài là UDP. Cái giá là một datagram có thể chỉ chứa một phần của cuộc trò chuyện đó, nên coi nó là bản ghi TLS độc lập sẽ tạo ra sự vô nghĩa. Việc lắp ghép lại phải diễn ra ở lớp giao thức. Đó là lý do một gói tin bị bắt hiếm khi trông giống một bước bắt tay hoàn chỉnh.
Chuyển truyền tải bên ngoài sang TCP không loại bỏ lớp này. Truyền tải tin cậy nghĩa là ít truyền lại hơn ở mức giao thức, không phải là việc đóng khung biến mất hay lưu lượng trở thành HTTP.
Các gói tin dữ liệu dùng định dạng khác
Khi phiên đã tồn tại, tải trọng hữu ích đến dưới dạng thông điệp dữ liệu mang gói IP bên trong hoặc khung Ethernet. Chúng được bảo vệ bằng khóa riêng và xử lý riêng, và chúng không phải bản ghi ứng dụng TLS theo bất kỳ nghĩa nào mà một thư viện TLS chấp nhận.
Sự tách biệt đó thấy được trong cấu hình: kênh điều khiển và kênh dữ liệu có cài đặt mật mã riêng, nên một dòng nhật ký nêu tên kênh này không nói gì về kênh kia. Đọc mật mã điều khiển mạnh như bằng chứng của mật mã dữ liệu mạnh là một lỗi báo cáo phổ biến.
Cũng đừng để một hiểu lầm liên quan lọt vào phần giải thích. TLS không phải một kênh khóa công khai ngồi cạnh kênh dữ liệu đối xứng, vì bản thân TLS bảo vệ các bản ghi của nó một cách đối xứng sau khi khóa được thiết lập. Sự khác biệt thực sự là vai trò và định dạng gói tin, không phải loại mật mã mà mỗi bên dùng.
Vì sao proxy HTTPS không thể giúp
Một proxy kết thúc TLS mong đợi một luồng bản ghi TLS và sau đó là một giao thức ứng dụng bên trong. Kênh điều khiển của giao thức này được mang bên trong khung riêng của nó với một lớp tin cậy bao quanh, nên proxy kết thúc đọc khung đó như đầu vào bị hỏng.
Một bộ chuyển tiếp trong suốt cho byte hoặc datagram đi qua mà không diễn giải có thể hoạt động, miễn là nó không viết lại hoặc lắp ghép lại luồng. Câu hỏi cần đặt ra với bất kỳ trung gian nào là nó có chuyển tiếp phương tiện truyền và khung thực tế hay không, chứ không phải nó có hỗ trợ TLS ở đâu đó hay không. Hãy hỏi điều đó trước khi dành một buổi tối cho các quy tắc proxy. Hầu hết các thất bại ở đây là về kiến trúc chứ không phải một cài đặt thiếu.
Đọc dấu vết đúng cách
Hãy mong đợi trước hết một trao đổi điều khiển, sau đó là số lượng lớn hơn nhiều thông điệp dữ liệu, cả hai chia sẻ một phương tiện truyền. Nếu pha điều khiển hoàn tất và pha dữ liệu bị kẹt, lỗi liên quan đến khóa, định tuyến hoặc lọc đường dữ liệu chứ không phải bắt tay. Bắt vài thông điệp dữ liệu và kiểm tra xem chúng có rời khỏi máy khách hay không. Một quan sát đó chia đôi việc tìm kiếm.
Các mô tả lịch sử về phương thức khóa trong tài liệu giao thức không ngụ ý rằng một bản phát hành nhất định vẫn hỗ trợ mọi định dạng cũ. Hãy kiểm tra phiên bản bạn chạy trước khi xây dựng kỳ vọng dựa trên một đoạn mô tả cách mọi thứ từng hoạt động.