使用Boost :: Beast的SSL隧道

时间:2017-12-29 22:16:46

标签: c++ ssl proxy boost-asio boost-beast

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

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

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

我认为,根据我的理解,当您使用ssl_stream时,您会记录整个通信,但是,我现在需要的是在CONNECT HTTP正文中插入加密的消息,我不会# 39;不知道该怎么做。

我已经知道这与lowest_layer / next_layer事情有关,但我不确定。

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

1 个答案:

答案 0 :(得分:2)

  1. 为连接声明变量(iocio_context

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

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

  3. 以纯文本格式发送请求(注释next_layer()

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

  4. 从代理

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

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

  8. 此时,您可以向stream写入HTTP请求,并正常使用Beast从stream读取HTTP响应(不要再次使用next_layer())。