ایجاد زمینه SSL ماژول بومی c++ در برنامه Electron خراب می شود

من در حال ساخت یک ماژول بومی C++ برای استفاده در یک برنامه Electron هستم. ماژول بومی مسئول ارتباط با سرور WebSocket است. من از کتابخانه WebSocketPP و کد نمونه زیر استفاده می کنم:
index.cc
#include // TLS
#include
typedef websocketpp::client<:config::asio_tls_client> client;
typedef websocketpp::config::asio_client::message_type::ptr message_ptr;
typedef websocketpp::lib::shared_ptr<:asio::ssl::context> context_ptr;
using websocketpp::lib::bind;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
//
...
//
class WebSocketHandler
{
public:
void set(const std::string &url, const std::string &token)
{
ws_url = url;
authorizationHeader = "Bearer " + token;
// Initialize ASIO
_webSocket.init_asio();
// Set logging to be pretty verbose (everything except message payloads)
_webSocket.set_access_channels(websocketpp::log::alevel::all);
_webSocket.clear_access_channels(websocketpp::log::alevel::frame_payload);
// Set open handler
_webSocket.set_open_handler(bind(&WebSocketHandler::on_open, this, std::placeholders::_1));
// Set close handler
_webSocket.set_close_handler(bind(&WebSocketHandler::on_close, this, std::placeholders::_1));
// Set fail handler
_webSocket.set_fail_handler(bind(&WebSocketHandler::on_fail, this, std::placeholders::_1));
// Set message handler
_webSocket.set_message_handler(bind(&WebSocketHandler::on_message, this, std::placeholders::_1, std::placeholders::_2));
// Set TLS handler
_webSocket.set_tls_init_handler(bind(&WebSocketHandler::on_tls_init, this, std::placeholders::_1));
}
void start()
{
websocketpp::lib::error_code ec;
client::connection_ptr con = _webSocket.get_connection(ws_url, ec);
if (ec)
{
std::cout << "Could not create connection because: " << ec.message() << std::endl;
return;
}
// Set the authorization header
con->replace_header("Authorization", authorizationHeader);
// Connect to server
_webSocket.connect(con);
// Start the ASIO io_service run loop
_thread.reset(new websocketpp::lib::thread(&client::run, &_webSocket));
}
void stop()
{
_webSocket.stop();
if (_thread && _thread->joinable())
{
_thread->join();
}
}
private:
context_ptr on_tls_init(websocketpp::connection_hdl hdl)
{
context_ptr ctx = websocketpp::lib::make_shared<:asio::ssl::context>(boost::asio::ssl::context::sslv23); // crash at this line
try {
// Simplified SSL options for testing
ctx->set_options(boost::asio::ssl::context::default_workarounds |
boost::asio::ssl::context::no_sslv2 |
boost::asio::ssl::context::no_sslv3 |
boost::asio::ssl::context::single_dh_use);
std::cout << "SSL options set successfully" << std::endl;
} catch (std::exception &e) {
std::cout << "Exception during set_options: " << e.what() << std::endl;
}
return ctx;
}
void on_open(websocketpp::connection_hdl hdl)
{
std::cout << "connection opened" << std::endl;
}
void on_close(websocketpp::connection_hdl hdl)
{
std::cout << "connection closed" << std::endl;
}
void on_fail(websocketpp::connection_hdl hdl)
{
std::cout << "connection failed" << std::endl;
}
void on_message(websocketpp::connection_hdl hdl, client::message_ptr msg)
{
std::cout << "message arrived" << std::endl;
}
client _webSocket;
std::string ws_url;
std::string authorizationHeader;
};
//
...
//
WebSocketHandler handler;
handler.set("wss://echo.websocket.org/", "Token_xxxx");
handler.start();
....
handler.stop();
binding.gyp
{
"targets": [
{
"target_name": "binding",
"include_dirs": [
"
اسکریپت تست
const engine = require("../bin/binding.node");
const test = async () => {
try {
engine.startConnection();
} catch (err) {
console.log("Error occurred", err);
}
};
test();
مشکل ماژول در یک اسکریپت آزمایشی جاوا اسکریپت به درستی کار می کند اما در Electron در این خط خراب می شود:
context_ptr ctx = websocketpp::lib::make_sharedboost::asio::ssl::context(boost::asio::ssl::context::sslv23);
من فکر می کنم که این مشکل ممکن است به نحوه پیوند کتابخانه های SSL مربوط باشد. من احساس می کنم پیوند دادن کتابخانه های SSL به صورت ایستا ممکن است مشکل را حل کند، اما مطمئن نیستم که چگونه می توانم به این موضوع برسم. من با چندین کتابخانه دیگر مبتنی بر بوست تست کردم اما نتیجه یکسان بود. در بخش ایجاد زمینه ssl فقط در کاربرد الکترون خراب می شود.
محیط
C++14/17
Electron v23 (ارتقای نسخه کمکی نمی کند)
WebSocketPP 0.8.2
نود 16.14.2/18.xx
وابستگی های نصب شده با استفاده از vcpkg: OpenSSL، WebSocketPP، Boost
سوال
چگونه می توانم کتابخانه های SSL را به صورت ایستا در پروژه خود پیوند دهم تا به طور بالقوه این مشکل را برطرف کنم؟ آیا راه حل یا بینش دیگری در مورد این مشکل وجود دارد؟
از کمکتان سپاسگزارم!