2

c で記述された SSL 対応の Web ソケット クライアント プログラムで libwebsockets 1.3 を使用しています。コンパイルはうまくいきますが、次のランタイム エラーが発生します。

problem creating ssl context 336236705: error:140A90A1:lib(20):func(169):reason(161)

libwebsockets コードを調べると、エラー メッセージを生成している部分を見つけました (lib/ssl.c 行 90):

/* basic openssl init */

SSL_library_init();

OpenSSL_add_all_algorithms();
SSL_load_error_strings();

openssl_websocket_private_data_index =
    SSL_get_ex_new_index(0, "libwebsockets", NULL, NULL, NULL);

/*
 * Firefox insists on SSLv23 not SSLv3
 * Konq disables SSLv2 by default now, SSLv23 works
 */

method = (SSL_METHOD *)SSLv23_server_method();

if (!method) {
    error = ERR_get_error();
    lwsl_err("problem creating ssl method %lu: %s\n", 
        error, ERR_error_string(error,
                      (char *)context->service_buffer));
    return 1;
}

context->ssl_ctx = SSL_CTX_new(method); /* create context */
if (!context->ssl_ctx) {
    error = ERR_get_error();
    lwsl_err("problem creating ssl context %lu: %s\n",
        error, ERR_error_string(error,
                      (char *)context->service_buffer));
    return 1;
}

Webで見た例によると、これはまったく問題ないように見えます.opensslのさまざまなバージョンの再インストール、上記のコードの変更、SSLv23_server_methodを他の方法に置き換えるなど、過去数日間、頭を悩ませ、検索してすべてを試してきましたなど...しかし、それを機能させることができません。問題がどこにあるのか誰か知っていますか?


追加情報: ERR_print_errors_fp() を使用すると、次のようになります。

3077879544:error:140A90A1:lib(20):func(169):reason(161):ssl_lib.c:1802:

libwebsocket_create_context を呼び出すコードの一部は次のようになります。

int opts = 0;

const char *interface = NULL;

int listen_port;

memset(&wsInfo, 0, sizeof wsInfo);

listen_port = CONTEXT_PORT_NO_LISTEN;

wsInfo.port = listen_port;
wsInfo.iface = interface;
wsInfo.protocols = protocols;
wsInfo.extensions = libwebsocket_get_internal_extensions();

wsInfo.gid = -1;
wsInfo.uid = -1;
wsInfo.options = opts;

wsContext = libwebsocket_create_context(&wsInfo);

プログラムは .so ライブラリにコンパイルされ、そのライブラリは修正バージョンのアスタリスクで使用されます (私が知る限り、それ自体は openssl を使用します)。

4

4 に答える 4

1

SSL_library_init()問題は、アスタリスクがおよびOpenSSL_add_all_algorithms()を含むすべての openssl 初期化関数をオーバーライドしmain\libasteriskssl.c、それらを何もしないダミー関数に置き換えます。代わりに、ast_ssl_init()すべての初期化を実行main()main/asterisk.c、 で 1 回呼び出される を定義します。私のコードはたまたまその呼び出しの前にありました。

于 2014-12-25T09:30:51.690 に答える