Boost::Beast 的 SSL 隧道

SSL tunnel with Boost::Beast

我想连接到只允许 HTTP 连接的代理服务器,通过 HTTPS 与目标服务器通信。

代理服务器文档指出,唯一的方法是通过 HTTP 连接动词(他们计划将直接 HTTPS 连接添加到代理服务器本身,但目前只允许 HTTP 连接) .

在我的 C++ 程序中,我在几个月内使用 ssl_stream 成功连接并使用了目标服务器,使用 boost::asio 而没有 boost::beast,但我现在想要使用 boost::beast 的代理使事情变得更容易;所以,我现在如何使用 boost::asio 但我是一个 boost::beast 新手(而且我也不完全理解 SSL 是如何工作的)。

我的想法是,在我的理解中,当您使用 ssl_stream 时,您加密了整个通信,但是,我现在需要的是将加密的消息插入 CONNECT HTTP 正文中,并且我不知道该怎么做。

我读到这与 lowest_layer/next_layer 相关,但我不确定。

有人可以提供与代理服务器的完整 read/write 连接的示例吗?或至少进一步说明?

  1. 为连接声明一个变量(iocio_context

    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> stream{ioc};

  2. 使用 Beast

  3. 构建 CONNECT HTTP 请求消息 (req)
  4. 以纯文本形式向代理发送请求(注意next_layer()

    boost::beast::http::write(stream.next_layer(), req);

  5. 从代理读取 HTTP 响应

  6. 如果响应为 OK 状态,则隧道已建立
  7. 现在执行 SSL 握手:

    stream.handshake(boost::asio::ssl::stream_base::client);

此时您可以像往常一样使用 Beast 向 stream 写入 HTTP 请求并从 stream 读取 HTTP 响应(不要再次使用 next_layer())。