170 похожих чатов

Приветствую! Хочу перенаправлять запросы со своего локального порта на внешний

сокс5 прокси. Уже все сделал, но мои запросы не хотят работать с TLS1.3, я не знаю как подключить сокет вместе с ним.

Отсюда и ошибка - если запрос https то сервер не хочет принимать мои запросы через прокси.

Как мне усовершенствовать мой сокет с прокси, чтобы запросы были успешными?

proxySocket.async_connect(
tcp::endpoint(boost::asio::ip::address::from_string(proxy.ip), proxy.port),
[this, self](const boost::system::error_code& error)};


Спасибо.

На картинке запрос curl через wireshark. Внизу моя программа, а вверху правильная работа непосредственно утилиты curl через прокси напрямую.

https://imgur.com/a/PXSeKqO

25 ответов

20 просмотров

openssl пробовал использовать?

Ivan- Автор вопроса
ᅠqwerty code Adminchik)
openssl пробовал использовать?

ковыряю сейчас, из непонятного момента - где мне взять сертификат? самому создать или скачать где-то?

можешь его через команду создать: openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

Ivan- Автор вопроса
ᅠqwerty code Adminchik)
можешь его через команду создать: openssl req -x5...

boost::asio::io_context ioContext; ssl::context sslContext(ssl::context_base::method::sslv23_client); sslContext.set_verify_mode(ssl::verify_peer); sslContext.set_default_verify_paths(); Proxy proxy = Proxy::parseProxy("user:pass@127.0.0.1:2333"); ssl::stream<tcp::socket> sslSocket(ioContext, sslContext); sslSocket.lowest_layer().async_connect( tcp::endpoint(boost::asio::ip::address::from_string(proxy.ip), proxy.port), [this, self](const boost::system::error_code& error) { if (!error) { sslSocket.async_handshake(boost::asio::ssl::stream_base::client, // здесь ошибка хендшейка [this, self](const boost::system::error_code& error) {}); } не удается получить хендшейк wrong version number (SSL routines)

Ivan
boost::asio::io_context ioContext; ssl::context ss...

У вас контекст sslv23_client, а не tlsv13

Ivan- Автор вопроса
Max
У вас контекст sslv23_client, а не tlsv13

спасибо, я перебирал все варианты - сейчас попробую этот

Ivan- Автор вопроса
Max
У вас контекст sslv23_client, а не tlsv13

Поменял но тоже самое( В чем может быть причина? tlsv13_client тоже пробовал boost::asio::io_context ioContext; ssl::context sslContext(ssl::context_base::method::tlsv13); sslContext.set_verify_mode(ssl::verify_peer); sslContext.set_default_verify_paths(); Proxy proxy = Proxy::parseProxy("127.0.0.1:12076"); ssl::stream<tcp::socket> sslSocket(ioContext, sslContext); sslSocket.lowest_layer().async_connect( tcp::endpoint(boost::asio::ip::address::from_string(proxy.ip), proxy.port), [this, self](const boost::system::error_code& error) { if (!error) { sslSocket.async_handshake(boost::asio::ssl::stream_base::client, [this, self](const boost::system::error_code& error) { if (!error) {} else { std::cout << "async_handshake() " << error.message(); // wrong version number (SSL routines) } }); } }); ioContext.run();

Ivan- Автор вопроса

да, ранее отправлял wireshark где тестировал curl напрямую через прокси и там был tls1.3 прокси мои с логином и паролем, пробую сделать handshake до логина после не знаю как сейчас тестирую без пароля - тоже самое, ошибка ssl именно

Ivan- Автор вопроса
Max
А какой curl запрос сработал?

curl -x socks5://proxy:port https://duckduckgo.com - через внешний прокси, в моей программе не работает curl -x socks5://proxy:port http://duckduckgo.com - через внешний и мою программу работает

Ivan
curl -x socks5://proxy:port https://duckduckgo.com...

А где твоя программа в этой схеме?

Ivan- Автор вопроса
Max
А где твоя программа в этой схеме?

Я либо curl отправляю через 127.0.0.1:15000 что подхватывает моя программа и пытается редиректнуть услышав трафик на порту 15000. Либо я напрямую пишу прокси в curl и все работает как надо.

Ivan- Автор вопроса
Max
Proxy точно поддерживает tls1.3?

Проблема была в том, что сначала надо было прочитать все из прокси, а только потом устанавливать хендшейк. Я изменил теперь у меня все успешно, только ошибка теперь новая LibreSSL/3.3.6: error:1404B42E:SSL routines:ST_CONNECT:tlsv1 alert protocol version

Ivan- Автор вопроса
Ivan
Проблема была в том, что сначала надо было прочита...

Не эксперт в socks5. Но просто с точки зрения здравого смысла, туда не надо ещё и записать что-то перед tls handshake?

Ivan- Автор вопроса
Max
Не эксперт в socks5. Но просто с точки зрения здра...

Ну я уже завтра буду копать, большое спасибо ) еще немного совсем думаю, одна деталь

Ivan- Автор вопроса
Max
Не эксперт в socks5. Но просто с точки зрения здра...

Я решил проблему tls 1.3 подключения, проблема была как раз в очередности чтения и записи из локального сокета во внешний и наоборот. Есть программа которая перенаправляет трафик с локального порта 15000 на внешний прокси сокс5. * (304) (OUT), TLS handshake, Client hello (1): * (304) (IN), TLS handshake, Server hello (2): * (304) (IN), TLS handshake, Unknown (8): * (304) (IN), TLS handshake, Certificate (11): * (304) (IN), TLS handshake, CERT verify (15): * (304) (IN), TLS handshake, Finished (20): * (304) (OUT), TLS handshake, Finished (20): Выше лог утилиты curl. Начиная handshake сокеты клиента и прокси общаются между собой пакетами. Проблема что возникла - пакетами они общаются не по очереди, а передают друг другу сразу по несколько, рандомное количество. Я не знаю как придумать условие, которое бы правильно переключало чтение и запись одного сокета в другой, так как не знаю заранее сколько пакетов один сокет отправит, прежде чем другой что-то ответит после записи в него. Сейчас мое переключение выглядит так if clientDataLength == 0x5EA (что равняется величине пакета MTU 1514 у меня). Если пакет заполнился - то продолжаем. Но это работает только в конкретном случае, а не для всего. Проверка на end of file тоже не дает результата - программа виснет. Какую логику применить чтобы правильно переключать чтение/запись с прокси сокета либо клиентского сокета. Спасибо void Socks5Server::readProxyData() { boost::system::error_code error; proxyDataLength = boost::beast::get_lowest_layer(sslSocket).read_some(boost::asio::buffer(proxyData), error); if (!error) { writeProxyDataToClient(); } else { std::cout << "[Read Proxy Data Error]: " << error.value() << " " << error.message() << std::endl; sslSocket.lowest_layer().close(); clientSocket.close(); } } void Socks5Server::readClientData() { boost::system::error_code error; clientDataLength = clientSocket.read_some(boost::asio::buffer(clientData), error); if (!error) { writeClientDataToProxy(); } else { std::cout << "[Read Client Data Error]: " << error.value() << " " << error.message() << std::endl; sslSocket.lowest_layer().close(); clientSocket.close(); } } void Socks5Server::writeClientDataToProxy() { boost::asio::write(boost::beast::get_lowest_layer(sslSocket), boost::asio::buffer(clientData, clientDataLength)); if (clientDataLength == 0x5EA || clientDataLength == 0x6) { readClientData(); } else { readProxyData(); } } void Socks5Server::writeProxyDataToClient() { boost::asio::write(clientSocket, boost::asio::buffer(proxyData, proxyDataLength)); if (proxyDataLength == 0x5EA) { readProxyData(); } else { readClientData(); } }

Ivan
Я решил проблему tls 1.3 подключения, проблема был...

Его не нужно "переключать". TCP полнодуплексный, он может читать и писать одновременно. Стандартные подходы к этому -- либо вынести чтения в разные потоки, либо использовать какой-то механизм мультиплексирования (select, epoll), либо просто сразу использовать boost::asio.

Ivan- Автор вопроса
Max
Его не нужно "переключать". TCP полнодуплексный, о...

то есть просто запущу ассинхронно чтение и запись и все гуд будет

Ivan- Автор вопроса
Max
Да

Спасибо попробую

Ivan- Автор вопроса
Max
Да

Огромное спасибо, у меня получилось! Еще хотел поинтересоваться - глупая ли идея вынести сделать одну аутентификацию на все подключения ко внешнему прокси? Я пытаюсь сделать и зациклить метод do_accept(), но при втором проходе сокет proxySocket умирает. Я его не закрываю и везде добавить auto self(shared_from_this()); Так нельзя делать или я неправильно реализовал? Главная цель - пропустить аутентификацию на всех потоках, что значительно ускорит работу. Спасибо. void startConnection() { auto self(shared_from_this()); proxySocket.async_connect( tcp::endpoint(boost::asio::ip::address::from_string(proxy.ip), proxy.port), [this, self](const boost::system::error_code& error) { if (!error) { proxySocket.async_write_some(boost::asio::buffer(socks5AuthResponse), [this, self](const boost::system::error_code& error, std::size_t) { if (!error) {proxyAuthResponse();} }); } }); } void proxyAuthResponse() { auto self(shared_from_this()); proxySocket.async_read_some(boost::asio::buffer(response), [this, self](const boost::system::error_code& error, std::size_t bytes_transferred) { if (!error && bytes_transferred == 2 && response[0] == 0x05 && response[1] == 0x02) { authData = { 0x01, static_cast<std::uint8_t>(proxy.login.length()) }; authData.insert(authData.end(), proxy.login.begin(), proxy.login.end()); authData.push_back(static_cast<std::uint8_t>(proxy.password.length())); authData.insert(authData.end(), proxy.password.begin(), proxy.password.end()); proxySocket.async_write_some(boost::asio::buffer(authData), [this, self](const boost::system::error_code& error, std::size_t) { if (!error) {proxyAuthResult();} } ); } }); } void proxyAuthResult() { auto self(shared_from_this()); proxySocket.async_read_some(boost::asio::buffer(response), [this, self](const boost::system::error_code& error, std::size_t bytes_transferred) { if (!error && bytes_transferred == 2 && response[0] == 0x01 && response[1] == 0x00) { do_accept(); } } ); } void do_accept() { auto self(shared_from_this()); acceptor.async_accept(clientSocket, [this, self](boost::system::error_code ec) { if (!ec) { std::make_shared<Socks5Server>(std::move(proxySocket), std::move(clientSocket), session_id++, proxy)->run(); } do_accept(); }); }

Похожие вопросы

Обсуждают сегодня

Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта