Я хочу подключиться к прокси-серверу, который разрешает только HTTP-соединения, чтобы разговаривать с целевым сервером по HTTPS.

В документации по прокси-серверу указано, что единственный способ сделать это - использовать команду HTTP Connect (они планируют добавить прямые HTTPS-соединения к самому прокси-серверу, но на данный момент разрешены только HTTP-соединения).

В моей программе на C ++ я успешно подключился и работал с целевым сервером с помощью ssl_stream в течение нескольких месяцев, используя boost::asio без boost::beast, но теперь я хочу использовать прокси, используя boost::beast, чтобы упростить задачу; Итак, теперь я знаю, как работать с boost :: asio, но я новичок boost::beast (и я не совсем понимаю, как работает SSL).

Думаю, что, в моем понимании, когда вы используете ssl_stream, вы записываете все сообщение, однако теперь мне нужно вставить зашифрованное сообщение в тело CONNECT HTTP, и я не знаю, как сделать это.

Я читал, что это как-то связано с проблемой lowest_layer / next_layer, но я не уверен.

Может ли кто-нибудь привести пример полного соединения чтения / записи с прокси-сервером? или хотя бы дальнейшие разъяснения?

4
Peregring-lk 30 Дек 2017 в 01:16

1 ответ

Лучший ответ
  1. Объявите переменную для соединения (ioc - это io_context)

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

  2. Создайте сообщение HTTP-запроса CONNECT (req) с помощью Beast

  3. Отправьте запрос на прокси в виде обычного текста (примечание next_layer())

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

  4. Прочитать ответ HTTP от прокси

  5. Если ответ имеет статус ОК, туннель установлен.
  6. Теперь выполните квитирование SSL:

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

На этом этапе вы можете писать HTTP-запросы к stream и читать HTTP-ответы от stream, используя Beast как обычно (не используйте next_layer() снова).

5
Vinnie Falco 5 Янв 2018 в 16:59