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 <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
|
||||
{
|
||||
AT_IPV4 = 0,
|
||||
@ -66,46 +77,86 @@ std::string ConnectRequestRecord::getRequestData()
|
||||
class proxyClient
|
||||
{
|
||||
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)
|
||||
, 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()
|
||||
{
|
||||
ioService.post([this]() { socket.close(); });
|
||||
ioService.post([this]() { lowerSocket().close(); });
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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()
|
||||
{
|
||||
std::array<char, 3> version = {0x05, 0x01, 0x02};
|
||||
@ -121,7 +172,7 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -146,12 +197,12 @@ private:
|
||||
else
|
||||
{
|
||||
//Others not supported
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -178,7 +229,7 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -203,7 +254,7 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
|
||||
@ -230,7 +281,7 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -252,12 +303,12 @@ private:
|
||||
else
|
||||
{
|
||||
//Authorization is not succeed
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -278,7 +329,7 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -324,7 +375,7 @@ private:
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
@ -389,7 +440,7 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -411,7 +462,7 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
socket.close();
|
||||
lowerSocket().close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -430,87 +481,36 @@ private:
|
||||
}
|
||||
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:
|
||||
boost::asio::io_service& ioService;
|
||||
boost::asio::ip::tcp::socket socket;
|
||||
|
||||
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket;
|
||||
};
|
||||
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
std::cout << "Hello" << std::endl;
|
||||
|
||||
|
||||
boost::asio::io_service ioService;
|
||||
//boost::asio::io_service::work work(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(); });
|
||||
|
||||
|
@ -74,11 +74,12 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<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>
|
||||
<Link>
|
||||
<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>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
@ -99,13 +100,14 @@
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<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>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<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>
|
||||
</ItemDefinitionGroup>
|
||||
<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