Với ssl::stream<tcp::socket> đi qua một proxy HTTP thường, trước hết hãy dùng tầng truyền thô của nó, rồi mới để nó thực hiện TLS tới đích:

auto& transport = tlsStream.next_layer();
  1. Kết nối tầng truyền đó tới máy chủ và cổng proxy. Khi đích HTTPS công khai được phép và chưa cấu hình thông tin xác thực proxy, danh sách proxy HTTP cung cấp các điểm cuối ứng viên; hãy kiểm tra ứng viên có cho phép đường hầm yêu cầu hay không.
  2. Gửi CONNECT nêu authority của đích, chẳng hạn api.example:443, và phân tích toàn bộ tiêu đề phản hồi trên tầng truyền thường. Mã 2xx thành công sẽ mở đường hầm; lời từ chối vẫn là phản hồi của proxy HTTP.
  3. Cấu hình tên máy chủ đích, SNI cần thiết, các gốc tin cậy và kiểm tra peer, rồi khởi động bắt tay phía máy khách trên tlsStream.
  4. Sau khi TLS thành công, hãy dùng đọc và ghi qua luồng SSL cho ứng dụng. Đọc trực tiếp lớp bên dưới lúc này sẽ bỏ qua xử lý TLS.

Chuyển phần dư của bộ phân tích HTTP sang giai đoạn sau. Asio có các quá tải bắt tay có bộ đệm; vứt bỏ phần đuôi do bộ phân tích sở hữu có thể làm mất các byte đã đọc từ socket.

Với kiểu đơn giản này, next_layer và lowest_layer đều tới TCP. Nhiều lớp bọc hơn có thể khiến chúng khác nhau, nên hãy chọn giao diện mang giao thức truyền thực tế của proxy. Proxy HTTPS thêm một tầng TLS nữa và nằm ngoài chuỗi CONNECT văn bản thuần này.

Bài viết liên quan