带有 Boost::Beast 的 SSL 隧道

Per*_*-lk 4 c++ ssl proxy boost-asio boost-beast

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

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

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

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

我读过这与lowest_layer/next_layer事情有关,但我不确定。

任何人都可以提供与代理服务器的完整读/写连接的示例吗?或至少进一步澄清?

Vin*_*lco 5

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

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

  2. req使用 Beast构建 CONNECT HTTP 请求消息 ( )

  3. 以纯文本形式向代理发送请求(注意next_layer()

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

  4. 从代理读取 HTTP 响应

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

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

此时,您可以照常使用 Beast将 HTTP 请求写入stream和读取 HTTP 响应stream(不要next_layer()再次使用)。