Added OpenSSL support
This commit is contained in:
parent
7568aa4993
commit
d22850c3b6
BIN
libcrypto-1_1.dll
Executable file
BIN
libcrypto-1_1.dll
Executable file
Binary file not shown.
BIN
libssl-1_1.dll
Executable file
BIN
libssl-1_1.dll
Executable file
Binary file not shown.
196
main.cpp
196
main.cpp
@ -5,6 +5,17 @@
|
|||||||
#include <array>
|
#include <array>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
|
|
||||||
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
|
#define SSL_R_SHORT_READ 219
|
||||||
|
#include "ssl/ssl_locl.h"
|
||||||
|
#include <boost/asio/ssl.hpp>
|
||||||
|
|
||||||
|
#if defined(close)
|
||||||
|
#undef close
|
||||||
|
#endif
|
||||||
|
|
||||||
enum AddressType
|
enum AddressType
|
||||||
{
|
{
|
||||||
AT_IPV4 = 0,
|
AT_IPV4 = 0,
|
||||||
@ -66,46 +77,86 @@ std::string ConnectRequestRecord::getRequestData()
|
|||||||
class proxyClient
|
class proxyClient
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
proxyClient(boost::asio::io_service& ioServiceIn, boost::asio::ip::tcp::resolver::iterator endpointIn)
|
proxyClient(boost::asio::io_service& ioServiceIn, boost::asio::ssl::context& context, boost::asio::ip::tcp::resolver::iterator endpointIn)
|
||||||
: ioService(ioServiceIn)
|
: ioService(ioServiceIn)
|
||||||
, socket(ioServiceIn)
|
, socket(ioServiceIn, context)
|
||||||
{
|
{
|
||||||
do_connect(endpointIn);
|
socket.set_verify_mode(boost::asio::ssl::verify_peer);
|
||||||
|
socket.set_verify_callback(
|
||||||
|
std::bind(&proxyClient::verify_certificate, this, std::placeholders::_1, std::placeholders::_2));
|
||||||
|
|
||||||
|
|
||||||
|
doConnect(endpointIn);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
void write(const chat_message& msg)
|
|
||||||
{
|
|
||||||
io_service_.post(
|
|
||||||
[this, msg]()
|
|
||||||
{
|
|
||||||
bool write_in_progress = !write_msgs_.empty();
|
|
||||||
write_msgs_.push_back(msg);
|
|
||||||
if (!write_in_progress)
|
|
||||||
{
|
|
||||||
do_write();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
void close()
|
void close()
|
||||||
{
|
{
|
||||||
ioService.post([this]() { socket.close(); });
|
ioService.post([this]() { lowerSocket().close(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void do_connect(boost::asio::ip::tcp::resolver::iterator endpointIterator)
|
|
||||||
|
boost::asio::ssl::stream<boost::asio::ip::tcp::socket>::lowest_layer_type& lowerSocket()
|
||||||
{
|
{
|
||||||
boost::asio::async_connect(socket, endpointIterator,
|
return socket.lowest_layer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void doConnect(boost::asio::ip::tcp::resolver::iterator endpointIterator)
|
||||||
|
{
|
||||||
|
boost::asio::async_connect(lowerSocket(), endpointIterator,
|
||||||
[this](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator)
|
[this](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator)
|
||||||
{
|
{
|
||||||
if (!ec)
|
if (!ec)
|
||||||
{
|
{
|
||||||
sendVersion();
|
//sendVersion();
|
||||||
|
|
||||||
|
doHandshake();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void doHandshake()
|
||||||
|
{
|
||||||
|
socket.async_handshake(boost::asio::ssl::stream_base::client,
|
||||||
|
[this](const boost::system::error_code& error) {
|
||||||
|
|
||||||
|
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
sendVersion();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Handshake failed: " << error.message() << "\n";
|
||||||
|
lowerSocket().close();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool verify_certificate(bool preverified,
|
||||||
|
boost::asio::ssl::verify_context& ctx)
|
||||||
|
{
|
||||||
|
// The verify callback can be used to check whether the certificate that is
|
||||||
|
// being presented is valid for the peer. For example, RFC 2818 describes
|
||||||
|
// the steps involved in doing this for HTTPS. Consult the OpenSSL
|
||||||
|
// documentation for more details. Note that the callback is called once
|
||||||
|
// for each certificate in the certificate chain, starting from the root
|
||||||
|
// certificate authority.
|
||||||
|
|
||||||
|
// In this example we will simply print the certificate's subject name.
|
||||||
|
char subject_name[256];
|
||||||
|
X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
|
||||||
|
X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
|
||||||
|
std::cout << "Verifying " << subject_name << "\n";
|
||||||
|
|
||||||
|
return preverified;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void sendVersion()
|
void sendVersion()
|
||||||
{
|
{
|
||||||
std::array<char, 3> version = {0x05, 0x01, 0x02};
|
std::array<char, 3> version = {0x05, 0x01, 0x02};
|
||||||
@ -121,7 +172,7 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -146,12 +197,12 @@ private:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Others not supported
|
//Others not supported
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -178,7 +229,7 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -203,7 +254,7 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -230,7 +281,7 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -252,12 +303,12 @@ private:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Authorization is not succeed
|
//Authorization is not succeed
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -278,7 +329,7 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -324,7 +375,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
connectResponseRecord.connectResponseType = static_cast<ConnectResponseRecord::ConnectResponseType>(connectResponseRecord.rawData[1]);
|
connectResponseRecord.connectResponseType = static_cast<ConnectResponseRecord::ConnectResponseType>(connectResponseRecord.rawData[1]);
|
||||||
connectResponseRecord.addressType = static_cast<AddressType>(connectResponseRecord.rawData[2]);
|
connectResponseRecord.addressType = static_cast<AddressType>(connectResponseRecord.rawData[3]);
|
||||||
|
|
||||||
size_t portOffset = 8;
|
size_t portOffset = 8;
|
||||||
|
|
||||||
@ -389,7 +440,7 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -411,7 +462,7 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -430,87 +481,36 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
socket.close();
|
lowerSocket().close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void do_read_header()
|
|
||||||
{
|
|
||||||
boost::asio::async_read(socket_,
|
|
||||||
boost::asio::buffer(read_msg_.data(), chat_message::header_length),
|
|
||||||
[this](boost::system::error_code ec, std::size_t length)
|
|
||||||
{
|
|
||||||
if (!ec && read_msg_.decode_header())
|
|
||||||
{
|
|
||||||
do_read_body();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
socket_.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_read_body()
|
|
||||||
{
|
|
||||||
boost::asio::async_read(socket_,
|
|
||||||
boost::asio::buffer(read_msg_.body(), read_msg_.body_length()),
|
|
||||||
[this](boost::system::error_code ec, std::size_t length)
|
|
||||||
{
|
|
||||||
if (!ec)
|
|
||||||
{
|
|
||||||
std::cout.write(read_msg_.body(), read_msg_.body_length());
|
|
||||||
std::cout << "\n";
|
|
||||||
do_read_header();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
socket_.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_write()
|
|
||||||
{
|
|
||||||
boost::asio::async_write(socket_,
|
|
||||||
boost::asio::buffer(write_msgs_.front().data(),
|
|
||||||
write_msgs_.front().length()),
|
|
||||||
[this](boost::system::error_code ec, std::size_t length)
|
|
||||||
{
|
|
||||||
if (!ec)
|
|
||||||
{
|
|
||||||
write_msgs_.pop_front();
|
|
||||||
if (!write_msgs_.empty())
|
|
||||||
{
|
|
||||||
do_write();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
socket_.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
private:
|
private:
|
||||||
boost::asio::io_service& ioService;
|
boost::asio::io_service& ioService;
|
||||||
boost::asio::ip::tcp::socket socket;
|
|
||||||
|
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
std::cout << "Hello" << std::endl;
|
std::cout << "Hello" << std::endl;
|
||||||
|
|
||||||
boost::asio::io_service ioService;
|
boost::asio::io_service ioService;
|
||||||
|
//boost::asio::io_service::work work(ioService);
|
||||||
|
|
||||||
boost::asio::ip::tcp::resolver resolver(ioService);
|
boost::asio::ip::tcp::resolver resolver(ioService);
|
||||||
auto endpointIterator = resolver.resolve({ "telegram-proxy.fishrungames.com", "8043" });
|
//auto endpointIterator = resolver.resolve({ "telegram-proxy.fishrungames.com", "8043" });
|
||||||
|
auto endpointIterator = resolver.resolve({ "127.0.0.1", "8043" });
|
||||||
|
|
||||||
|
|
||||||
|
boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);
|
||||||
|
ctx.load_verify_file("rootca.crt");
|
||||||
|
|
||||||
|
|
||||||
proxyClient c(ioService, endpointIterator);
|
proxyClient c(ioService, ctx, endpointIterator);
|
||||||
|
|
||||||
std::thread t([&ioService]() { ioService.run(); });
|
std::thread t([&ioService]() { ioService.run(); });
|
||||||
|
|
||||||
|
@ -74,11 +74,12 @@
|
|||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>../boost_1_63_0</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>../boost_1_63_0;../../openssl-master;../../openssl-master/include;../../openssl-master/output/include</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>../boost_1_63_0/stage/x86/lib/</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>../boost_1_63_0/stage/x86/lib/;../../openssl-master/output/lib</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>libcrypto.lib;libssl.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
@ -99,13 +100,14 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>../boost_1_63_0</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>../boost_1_63_0;../../openssl-master;../../openssl-master/include;../../openssl-master/output/include</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<AdditionalLibraryDirectories>../boost_1_63_0/stage/x86/lib/</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>../boost_1_63_0/stage/x86/lib/;../../openssl-master/output/lib</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>libcrypto.lib;libssl.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
24
rootca.crt
Executable file
24
rootca.crt
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIECTCCAvGgAwIBAgIJAKlzlxSAr1BkMA0GCSqGSIb3DQEBCwUAMIGZMQswCQYD
|
||||||
|
VQQGEwJMVjETMBEGA1UECAwKU29tZS1TdGF0ZTENMAsGA1UEBwwEUmlnYTEbMBkG
|
||||||
|
A1UECgwSRmlzaCBSdW4gR2FtZXMgU0lBMRcwFQYDVQQDDA5mcmctcHJveHktcm9v
|
||||||
|
dDEwMC4GCSqGSIb3DQEJARYhdmxhZGlzbGF2Lmtob3JldkBmaXNocnVuZ2FtZXMu
|
||||||
|
Y29tMCAXDTE3MDgwNjE4MjgxMFoYDzIwNzIwNTA5MTgyODEwWjCBmTELMAkGA1UE
|
||||||
|
BhMCTFYxEzARBgNVBAgMClNvbWUtU3RhdGUxDTALBgNVBAcMBFJpZ2ExGzAZBgNV
|
||||||
|
BAoMEkZpc2ggUnVuIEdhbWVzIFNJQTEXMBUGA1UEAwwOZnJnLXByb3h5LXJvb3Qx
|
||||||
|
MDAuBgkqhkiG9w0BCQEWIXZsYWRpc2xhdi5raG9yZXZAZmlzaHJ1bmdhbWVzLmNv
|
||||||
|
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM5NIDsckYAgP1zhXwzg
|
||||||
|
DHOnFbpQCF0gJVOQK66tgda7o5vbLFqzqW5R6rRieNdlUEtztXrRMjO+1LYBQ+vD
|
||||||
|
bT058uwlTgD7xpRtr73kMoPBosZpxRxBKJpp60wOHLyZJqSn16WlgTm8/TTTaF2R
|
||||||
|
yFYhHxGM+xkDzgXo0LU0yjHOgsJSlnBHGC6mmbrdzCGY9c7hFcYPawCty+FNIqVW
|
||||||
|
eFEWHSOXqAhADxp5KbdrcUK8EmVljRLEGItctiRdq9PWxhHpodEgKiwOUk0bXds/
|
||||||
|
ErTw1ozopqSYZD5RgL1DcL3T/bKbGDdqp+blIZN1nsL6hYW4b2gHPTSNrUkBkt5v
|
||||||
|
oz0CAwEAAaNQME4wHQYDVR0OBBYEFHhY1354tUtbEk1mMtRcRbgK4LPsMB8GA1Ud
|
||||||
|
IwQYMBaAFHhY1354tUtbEk1mMtRcRbgK4LPsMAwGA1UdEwQFMAMBAf8wDQYJKoZI
|
||||||
|
hvcNAQELBQADggEBAMEiLatj4IURN1U1779TLRbKf4gIVlopey0xbzSRSosNtAOu
|
||||||
|
s+zApVzaDEDdULM7YhkXo+kThp41xCU7xMZZan0XyvTcos1KTjHISf3swJb9L8XT
|
||||||
|
S6t/D2bUt+FnjKCyRC3xtheNhoxOwCAQXNvXu5HJ1O87eDxYorQQ5ujAjbToxbTs
|
||||||
|
i8xR9HwLe3h36NY22qsX6LRohZufXa3S8YUATW2frDp1q7vArBXuY7o/+UIQxn49
|
||||||
|
dTzAqYhEpBJZw7MZB/3BqHPzmZ3jqEsj3HK6rgxwlYEnY6kB6eAhiAtaPVARx538
|
||||||
|
6Yz8LsofRoZSVnytmYquxiWB7YJuhEYiIwrpcXo=
|
||||||
|
-----END CERTIFICATE-----
|
Loading…
Reference in New Issue
Block a user