ssl working

This commit is contained in:
C
2022-07-29 12:48:08 +05:00
parent f9fc3dc42d
commit 7d9cc2e971
3 changed files with 339 additions and 273 deletions
+101 -54
View File
@@ -1,6 +1,10 @@
// websocket // websocket
#include <boost/beast/core.hpp> #include <boost/beast/core.hpp>
#include <boost/beast/ssl.hpp>
#include <boost/beast/websocket.hpp> #include <boost/beast/websocket.hpp>
#include <boost/beast/websocket/ssl.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <thread> #include <thread>
@@ -40,10 +44,14 @@
// file read/write // file read/write
#include <fstream> #include <fstream>
// openssl
#define BOOST_NETWORK_ENABLE_HTTPS
namespace beast = boost::beast; namespace beast = boost::beast;
namespace http = beast::http; namespace http = beast::http;
namespace websocket = beast::websocket; namespace websocket = beast::websocket;
namespace net = boost::asio; namespace net = boost::asio;
namespace ssl = boost::asio::ssl;
using tcp = boost::asio::ip::tcp; using tcp = boost::asio::ip::tcp;
@@ -135,6 +143,8 @@ void LOG(std::stringstream&& s, WORD color)
} }
void do_session(tcp::socket sock, ssl::context& ctx, sessionManager& sessManager, std::string ip, uint64_t& user_n, std::string appPath, std::string appArgs, uint16_t portStream, uint16_t portHttp);
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
// disable console input // disable console input
@@ -175,18 +185,25 @@ int main(int argc, char* argv[])
// 5 - start_http_port // 5 - start_http_port
// 6 - start_streamer_port // 6 - start_streamer_port
// 7 - path_to_application // 7 - path to crt
// 8 - application_args (without -pixelStreamingPort cos its argv[3]) // 8 - path to key
// 9 - path to pem
// 10 - path_to_application
// 11 - application_args (without -pixelStreamingPort cos its argv[3])
// sessions // sessions
uint16_t sessionLimit = std::atoi(argv[1]); uint16_t sessionLimit = std::atoi(argv[1]);
sessionManager sessManager; sessionManager sessManager;
sessManager.setlimit(sessionLimit); sessManager.setlimit(sessionLimit);
// user count
uint64_t user_n = 0;
// merging app arguments // merging app arguments
std::string appPath = argv[7]; std::string appPath = argv[10];
std::string appArgs; std::string appArgs;
for (int i = 8; i < argc; ++i) for (int i = 11; i < argc; ++i)
appArgs += argv[i] + std::string(" "); appArgs += argv[i] + std::string(" ");
appArgs += "-PixelStreamingPort="; appArgs += "-PixelStreamingPort=";
@@ -195,10 +212,6 @@ int main(int argc, char* argv[])
uint16_t portHttp = std::atoi(argv[5]); uint16_t portHttp = std::atoi(argv[5]);
uint16_t portStream = std::atoi(argv[6]); uint16_t portStream = std::atoi(argv[6]);
// node js
/*std::string nodePath = "C:\\Program Files\\nodejs\\node.exe";
std::string nodeFilePath = argv[2];*/
// starting node js servers // starting node js servers
for (uint16_t i = 0; i < sessionLimit; ++i) for (uint16_t i = 0; i < sessionLimit; ++i)
{ {
@@ -209,63 +222,100 @@ int main(int argc, char* argv[])
std::string ip(argv[2]); std::string ip(argv[2]);
LOG((std::stringstream() << "ip: " << ip), 7); LOG((std::stringstream() << "ip: " << ip), 7);
auto const address = net::ip::make_address(ip); auto const address = net::ip::make_address(ip);
auto const port = static_cast<unsigned short>(std::atoi(argv[3])); auto const port = static_cast<uint16_t>(std::atoi(argv[3]));
LOG((std::stringstream() << "port: " << port), 7); LOG((std::stringstream() << "port: " << port), 7);
net::io_context ioc{ 1 };
tcp::acceptor acceptor{ ioc, {address, port} };
// stats count try
uint64_t user_n = 0; {
// the io_context is required for all I/O
net::io_context ioc{ 1 };
// the SSL context is required, and holds certificates
ssl::context ctx{ ssl::context::tlsv12 };
//// loading certificate, key, pem
ctx.use_certificate_chain_file(argv[7]);
ctx.use_private_key_file(argv[8], boost::asio::ssl::context::file_format::pem);
ctx.use_tmp_dh_file(argv[9]);
// the acceptor receives incoming connections
tcp::acceptor acceptor{ ioc, {address, port} };
while (true) while (true)
{ {
// This will receive the new connection
tcp::socket socket(ioc); tcp::socket socket(ioc);
// Block until we get a connection
acceptor.accept(socket); acceptor.accept(socket);
std::thread([ // Launch the session, transferring ownership of the socket
sock = std::move(socket), std::thread
&sessManager, {
&ip, &do_session,
&user_n, std::move(socket),
std::ref(ctx),
std::ref(sessManager),
ip,
std::ref(user_n),
appPath, appPath,
appArgs, appArgs,
portStream, portStream,
portHttp portHttp
//nodePath, }.detach();
//nodeFilePath }
]() mutable }
catch (const std::exception& e)
{
LOG(std::stringstream() << "Error: " << e.what(), 12);
return EXIT_FAILURE;
}
logFile.close();
return 0;
}
void do_session(tcp::socket sock, ssl::context& ctx, sessionManager& sessManager, std::string ip, uint64_t& user_n, std::string appPath, std::string appArgs, uint16_t portStream, uint16_t portHttp)
{ {
std::string user_ip = sock.remote_endpoint().address().to_string(); std::string user_ip = sock.remote_endpoint().address().to_string();
uint64_t user_id = std::chrono::system_clock::now().time_since_epoch().count(); uint64_t user_id = std::chrono::system_clock::now().time_since_epoch().count();
user_id = hash6(user_ip + std::to_string(user_id)); user_id = hash6(user_ip + std::to_string(user_id));
uint64_t thisUserNum = ++user_n; uint64_t thisUserNum = ++user_n;
LOG((std::stringstream() << "user(" << thisUserNum << ") connected (ip: " << user_ip << "), (id: " << user_id << ")"), 7); LOG((std::stringstream() << "user(" << thisUserNum << ") connected (ip: " << user_ip << "), (id: " << user_id << ")"), 7);
// init websocket // Construct the websocket stream around the socket
websocket::stream<tcp::socket> ws(std::move(const_cast<tcp::socket&>(sock))); websocket::stream<beast::ssl_stream<tcp::socket&>> ws(sock, ctx);
ws.accept(); //websocket::stream<tcp::socket> ws{ std::move(sock) };
/*try
try
{ {
ws.accept(); // Perform the SSL handshake
} ws.next_layer().handshake(ssl::stream_base::server);
catch (std::exception const& e) // Set a decorator to change the Server of the handshake
{ ws.set_option(websocket::stream_base::decorator(
std::cerr << "Error: " << e.what() << std::endl;
}*/
// Set a decorator to change the Server of the
/*ws.set_option(websocket::stream_base::decorator(
[](websocket::response_type& res) [](websocket::response_type& res)
{ {
res.set(http::field::server, std::string(BOOST_BEAST_VERSION_STRING) + " websocket-server-sync"); res.set(http::field::server,
}));*/ std::string(BOOST_BEAST_VERSION_STRING) +
" websocket-server-sync-ssl");
}));
ws.accept();
}
catch (const std::exception& e)
{
LOG(std::stringstream() << "Error: " << e.what(), 12);
return;
}
catch (beast::system_error const& se)
{
LOG(std::stringstream() << "Error: " << se.what(), 12);
return;
}
nlohmann::json jsonData; nlohmann::json jsonData;
std::string message; std::string message;
std::string content; std::string content;
//session sessTmp; //session sessTmp;
session* sessCur = nullptr; session* sessCur = nullptr;
uint32_t sessId = 0; uint32_t sessId = 0;
@@ -341,10 +391,8 @@ int main(int argc, char* argv[])
// get session port // get session port
uint16_t sessMinPort = sessManager.getMinPort(); //uint16_t sessMinPort = sessManager.getMinPort(portHttp);
if (!sessMinPort) uint16_t sessHttpPort = sessManager.getMinPort(portHttp);//(sessMinPort == 0) ? portHttp : sessMinPort + 1;
sessMinPort = portHttp;
uint16_t sessHttpPort = sessMinPort + 1;
uint16_t sessStreamPort = portStream + (sessHttpPort - portHttp); uint16_t sessStreamPort = portStream + (sessHttpPort - portHttp);
@@ -461,21 +509,19 @@ int main(int argc, char* argv[])
// ws.text(ws.got_text()); // ws.text(ws.got_text());
// boost::beast::ostream(buffer) << "something"; // boost::beast::ostream(buffer) << "something";
// ws.write(buffer.data()); // ws.write(buffer.data());
} }
catch (beast::system_error const& se) catch (const std::exception& e)
{ {
LOG((std::stringstream() << "user(" << thisUserNum << ") disconnected"), 7); LOG((std::stringstream() << "Error: " << e.what()), 14);
if (sessId) if (sessId)
{ {
sessManager.getById(sessId, &sessCur); sessManager.getById(sessId, &sessCur);
if (sessCur == nullptr) if (sessCur == nullptr)
{ {
std::cout << "nullptr session" << std::endl; std::cout << "nullptr session" << std::endl;
continue;
} }
else
{
sessCur->removeUserById(user_id); sessCur->removeUserById(user_id);
if (!sessCur->getUsersCount()) if (!sessCur->getUsersCount())
@@ -487,9 +533,14 @@ int main(int argc, char* argv[])
sessManager.remove(sessId); sessManager.remove(sessId);
} }
} }
}
LOG((std::stringstream() << "user(" << thisUserNum << ") disconnected"), 7);
break;
}
catch (beast::system_error const& se)
{
LOG((std::stringstream() << "user(" << thisUserNum << ") fdisconnected"), 7);
break; break;
/* if (se.code() != websocket::error::closed) /* if (se.code() != websocket::error::closed)
{ {
@@ -498,8 +549,4 @@ int main(int argc, char* argv[])
}*/ }*/
} }
} }
}).detach();
}
logFile.close();
return 0;
} }
+5 -2
View File
@@ -148,12 +148,14 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>C:\Libraries\json-develop\include;C:\Libraries\boost\include\boost_1_79_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>C:\Libraries\openssl\include;C:\Libraries\json-develop\include;C:\Libraries\boost\include\boost_1_79_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>C:\Libraries\openssl\apps\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>C:\Libraries\openssl\libcrypto.lib;C:\Libraries\openssl\libssl.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -164,7 +166,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>C:\Libraries\json-develop\include;C:\Libraries\boost\include\boost_1_79_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>C:\Libraries\json-develop\include;C:\Libraries\openssl\include;C:\Libraries\boost\include\boost_1_79_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
@@ -172,6 +174,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>C:\Libraries\openssl\libcrypto.lib;C:\Libraries\openssl\libssl.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='build|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='build|x64'">
+20 -4
View File
@@ -2,6 +2,7 @@
#include <vector> #include <vector>
#include <algorithm> #include <algorithm>
#include <iostream>
#pragma once #pragma once
class sessionManager class sessionManager
{ {
@@ -58,16 +59,31 @@ public:
return limit == sessions.size(); return limit == sessions.size();
} }
uint16_t getMinPort() uint16_t getMinPort(uint16_t desired)
{ {
// working not properly
if (!sessions.size()) if (!sessions.size())
return 0; return desired;
std::vector<uint16_t> ports; std::vector<uint16_t> ports;
for (auto& s : sessions) for (auto& s : sessions)
ports.push_back(s.getPort()); ports.push_back(s.getPort());
std::sort(ports.begin(), ports.end(), [](uint16_t a, uint16_t b) { return a > b; }); std::cout << "amount: " << ports.size() << std::endl;
return *(ports.begin()); std::cout << "ports: " << std::endl;
for (auto& s : ports)
std::cout << s << ", ";
std::cout << std::endl;
std::sort(ports.begin(), ports.end(), [](uint16_t a, uint16_t b) { return a < b; });
uint16_t port = desired;
for (auto p : ports)
{
if (desired != p)
return desired;
++desired;
}
return ports.back() + 1;
} }
}; };