Сервер libwebsocket с openSSL не принимает соединение

Я написал сервер веб-сокетов с помощью (библиотеки libwebsocket), который принимает клиентское соединение веб-сокета для не SSL. Теперь я хотел, чтобы он принимал SSL-соединение, поэтому я сгенерировал самозаверяющий сертификат и ключ, при создании контекста веб-сокета я также указал ключ и путь к сертификату, а также параметр LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT. Но при создании https-соединения с использованием wss://ip:7681 я получаю обратный вызов запроса на подключение, т. е. LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED, а после этого LWS_CALLBACK_WSI_DESTROY, а в браузере появляется консольная ошибка о невозможности подключения.

  Firefox can’t establish a connection to the server at wss://192.168.4.254:7681/.    

Пожалуйста, проверьте следующий код на стороне сервера, используемый для создания сервера веб-сокетов на основе openSSL.

struct lws_protocols WebSocketCommon::protocols[ 2 ] = { {"wss", WebSocketCommon::callback, 0,    0 },{ NULL, NULL, 0, 0 } };

int callback ( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len ) {
   switch ( reason ) {

    case LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED:
    {
         //code 
         break;      
    }
    case LWS_CALLBACK_WSI_DESTROY: 
    {
         //code 
         break;
    }  
    case LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS: {
        Log::d( m_r_logger, TAG, "LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS\n");
        SSL_CTX_load_verify_locations( (SSL_CTX*) user, NULL, getenv(SSL_CERT_FILE_PATH) );
        break;
    }
        default: {
            break;
    }
}

return lws_callback_http_dummy(wsi, reason, user, in, len);
} 

void createContext (bool useSSL) {
    struct lws_context_creation_info info;
    memset( &info, 0, sizeof(struct lws_context_creation_info) );

    info.port = 7681;
    info.uid = -1;
    info.gid = -1;
    info.protocols = protocols;
    info.mounts = &mount;

    info.extensions = exts;
    info.timeout_secs = 5;
    info.ip_limit_ah = 24; /* for testing */
    info.ip_limit_wsi = 400; /* for testing */

    // Following options for openSSL certificate
    if(useSSL){
        info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT | LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT | LWS_SERVER_OPTION_DISABLE_IPV6 | LWS_SERVER_OPTION_PEER_CERT_NOT_REQUIRED | LWS_SERVER_OPTION_IGNORE_MISSING_CERT;
        info.ssl_cert_filepath = SSL_CERT_FILE_PATH;
        info.ssl_private_key_filepath = SSL_PRIVATE_KEY_PATH;
    }
    fContext = lws_create_context( &info );

    }

Я получаю следующие журналы при создании контекста веб-сокета и принятии соединения wss.

WebSocket.cpp:638...... :createContext ( ) - begin
WebSocket.cpp:640...... : createContext - fReferenceCount = 0
WebSocket.cpp:324...... : Creating Vhost 'default' port 7681, 1 protocols, IPv6 off
WebSocket.cpp:324...... :  Using SSL mode
WebSocket.cpp:324...... :  SSL ECDH curve 'prime256v1'
WebSocket.cpp:612...... : LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS
WebSocket.cpp:324...... : lws_tls_client_create_vhost_context: doing cert filepath /etc/nginx  /ssl/mycert.crt
WebSocket.cpp:324...... : Loaded client cert /etc/nginx/ssl/mycert.crt
WebSocket.cpp:324...... : lws_tls_client_create_vhost_context: doing private key filepath
WebSocket.cpp:324...... : Loaded client cert private key /etc/nginx/ssl/mykey.key
WebSocket.cpp:324...... : created client ssl context for default
WebSocket.cpp:684...... : lws_create_context SUCCEEDED
WebSocket.cpp:759...... : start  Starting Service Thread.
WebSocket.cpp:705...... : createContext - fReferenceCount = 1 
WebSocket.cpp:706...... : createContext - end

Ниже приведены версии библиотек, которые я использую.

libwebsocket.so 13
OpenSSL 1.0.2o  27 Mar 2018

Пожалуйста, дайте мне знать, что происходит не так?


person Kuldeep More    schedule 05.11.2019    source источник
comment
Лучше отлаживать с помощью openssl в качестве клиента и подключаться к вашему серверу.   -  person Abhishek Chandel    schedule 05.11.2019


Ответы (1)


Проблема, возможно, не связана с libwebsockets, а связана с тем, что Firefox суетливо разрешает подключения к WSS, имеющим самоподписанный сертификат. Попробуйте подключиться к вашему серверу из какой-нибудь другой программы, например, из простой программы на Python.

связанные с:

В чем проблема с Websocket и самоподписанным SSL-сертификат

Firefox отключает подключение к веб-сокетам для самозаверяющего сертификата

person Darren Smith    schedule 05.11.2019