Проблема с хендшейком и получением вебсокет трафика на локальний прокси(C++\boost.beast) #3

Трафик перенаправлен с помощью FoxyProxy

main функция:

int main() {
    string input;
    try {
        net::io_context ioc{ 1 };

        ssl::context ctx_socket{ ssl::context::tlsv12 };
        ssl::context ctx_http(ssl::context::tlsv12_server);
        load_certificate(ctx_http);
        load_certificate(ctx_socket);

        tcp::acceptor http_acceptor(ioc, { net::ip::make_address("127.0.0.1"), 443 });
        tcp::acceptor ws_acceptor(ioc, { net::ip::make_address("127.0.0.1"), 444 });

        thread([&input]() {
            rubine_katana_console(input);
            }).detach();

        http_acceptor_func(http_acceptor, ctx_http);
        socket_acceptor_func(ws_acceptor, ctx_socket);

        ioc.run();

    }
    catch (const exception& e) {
        cout << "[✖] ERROR IN MAIN: " << e.what() << endl;
        return -1;
    }
    return 0;
}

работает нормально.

Websocket_acceptor:

void socket_acceptor_func(tcp::acceptor& acceptor, ssl::context& ctx_socket) {
    auto socket = std::make_shared<tcp::socket>(acceptor.get_executor());
    acceptor.async_accept(*socket, [socket, &acceptor, &ctx_socket](boost::system::error_code ec) {
        if (!ec) {
            std::thread([sock = std::move(*socket), &ctx_socket]() mutable {
                websocket_proxy_server(std::move(sock), ctx_socket);
                }).detach();
        }
        socket_acceptor_func(acceptor, ctx_socket);
        });
}

Функцию свою виполняет, не думаю что ошибка в нем.

Сама функция прокси для вебсокета:

void websocket_proxy_server(tcp::socket socket, ssl::context& ctx) {
    ssl::stream<tcp::socket> ssl_stream{ std::move(socket), ctx };

    std::cerr << "[WS] starting SSL handshake...\n";
    ssl_stream.handshake(ssl::stream_base::server);
    std::cerr << "[WS] SSL handshake OK\n";

    websocket::stream<ssl::stream<tcp::socket>> ws{ std::move(ssl_stream) };
    ws.set_option(websocket::stream_base::decorator(
        [](websocket::response_type& res) {
            res.set(http::field::server,
                std::string(BOOST_BEAST_VERSION_STRING) +
                " websocket-server-sync-ssl");
        }));

    ws.accept();

    for (;;) {
        beast::flat_buffer buffer;
        ws.read(buffer);
        std::cout << beast::buffers_to_string(buffer.data()) << std::endl;
    }
}

Здесь уже ошибка, видно что трафик бил перенаправлен, но обработка не происходит. std::cerr << "[WS] starting SSL handshake...\n"; - тут зависает, значит хендшейк не проходит. Известно что первий запрос серверу от сайта(по вебсокет):

wss://gs-kw5wg-7ncx9.london.moomoo.io/?token=...

Еще потом добавил логи, ошибок не било(тут в функции их убрал).

Если что функция для подгрузки сертификатов:

void load_certificate(ssl::context& ctx) {
    beast::error_code ec;
    string cert = R"()";
    string key = R"()";
    ctx.use_certificate_chain(boost::asio::buffer(cert.data(), cert.size()), ec);
    if (ec) {
        cerr << "cert error: " << ec.message() << "\n";
    }
    ctx.use_private_key(boost::asio::buffer(key.data(), key.size()), boost::asio::ssl::context::pem, ec);
    if (ec) {
        cerr << "key error: " << ec.message() << "\n";
    }
}

В чем может бить ошибка? +- делал по документации, как и всегда.


Ответы (0 шт):