Проблема 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]
Ну тут если и не убрать, ошибка будет.
В чем же проблема?
Все по документации.
Может ли сервер хотеть чего-то еще?