4

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

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

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

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

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

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

4

1 回答 1

5
  1. 为连接声明一个变量 ( iocis the io_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 向 Beast 写入 HTTP 请求stream和读取 HTTP 响应stream(不要next_layer()再次使用)。

于 2018-01-05T16:59:35.050 回答