Проблема c tls handshake с сервером сайта(boost\beast C++)

Создаю прокси. Трафик перенаправлен добавлением в C:\Windows\System32\drivers\etc\hosts - 127.0.0.1 moomoo.io. Когда я виступаю сервером для браузера, все с хендшейком впорядке.

Проблема когда питаюсь зделать хендшейк с сервером сайта

Полный блок кода:

void http_proxy_server(tcp::socket socket, ssl::context& ctx) {
    try {
        cout << "[!] START TLS HANDSHAKE..." << endl;
        beast::error_code ec;
        beast::ssl_stream<beast::tcp_stream> server_stream(
            beast::tcp_stream(std::move(socket)),
            ctx
        );
        server_stream.handshake(ssl::stream_base::server, ec);
        if (ec) {
            return fail(ec, "handshake");
        }
        cout << "[*] SUCCES" << endl;

        beast::flat_buffer buffer;
        http::request<http::string_body> req;
        http::read(server_stream, buffer, req, ec);
        string target = string(req.target());
        string host = string(req[http::field::host]);
        cout << "-----------------START--------------------" << endl;
        cout << "SENDING REQUEST: " << host + target << endl;
        cout << "-----------------END--------------------" << endl;
        
        net::io_context ioc;
        ssl::context ctx(ssl::context::tls_client);
        ctx.set_verify_mode(ssl::verify_none);
        tcp::resolver resolver(ioc);
        ssl::stream<beast::tcp_stream> s_stream(ioc, ctx);
        if (!SSL_set_tlsext_host_name(s_stream.native_handle(), host.c_str()))
        {
            throw beast::system_error(
                static_cast<int>(::ERR_get_error()),
                net::error::get_ssl_category());
        }
        s_stream.set_verify_callback(ssl::host_name_verification(host));
        auto const results = resolver.resolve(host, "443");
        beast::get_lowest_layer(s_stream).connect(results);
        s_stream.handshake(ssl::stream_base::client);


    }
    catch (const exception& e) {
        cout << "SERVER PROXY ERROR: " << e.what() << endl;
    }
}

Функция подгрузки сертификата:

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";
    }
}

Блок кода для хендшейка(идентичен с кодом из документации)

net::io_context ioc;
ssl::context ctx(ssl::context::tls_client);
load_certificate(ctx);
ctx.set_verify_mode(ssl::verify_peer);
tcp::resolver resolver(ioc);
ssl::stream<beast::tcp_stream> s_stream(ioc, ctx);
if (!SSL_set_tlsext_host_name(s_stream.native_handle(), host.c_str()))
{
    throw beast::system_error(
        static_cast<int>(::ERR_get_error()),
        net::error::get_ssl_category());
}
s_stream.set_verify_callback(ssl::host_name_verification(host));
auto const results = resolver.resolve(host, "443");
beast::get_lowest_layer(s_stream).connect(results);
s_stream.handshake(ssl::stream_base::client);

Ошибок нет, только предупреждения, но программа не запускается. Немного переписанный блок кода:

 net::io_context ioc;
 ssl::context ctx(ssl::context::tls_client);
 ctx.set_verify_mode(ssl::verify_none);
 tcp::resolver resolver(ioc);
 ssl::stream<beast::tcp_stream> s_stream(ioc, ctx);
 if (!SSL_set_tlsext_host_name(s_stream.native_handle(), host.c_str()))
 {
     throw beast::system_error(
         static_cast<int>(::ERR_get_error()),
         net::error::get_ssl_category());
 }
 s_stream.set_verify_callback(ssl::host_name_verification(host));
 auto const results = resolver.resolve(host, "443");
 beast::get_lowest_layer(s_stream).connect(results);
 s_stream.handshake(ssl::stream_base::client);

Тут изменено:

ctx.set_verify_mode(ssl::verify_none);

И убран load_certificate(ctx);

Выводит такую ошибку:

SERVER PROXY ERROR: ssl3 ext invalid servername (SSL routines) [asio.ssl:167772479]

Ну тут если и не убрать, ошибка будет.

В чем же проблема?

Все по документации.

Может ли сервер хотеть чего-то еще?


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