برنامه نویسی

ایجاد زمینه 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 را به صورت ایستا در پروژه خود پیوند دهم تا به طور بالقوه این مشکل را برطرف کنم؟ آیا راه حل یا بینش دیگری در مورد این مشکل وجود دارد؟

از کمکتان سپاسگزارم!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا