【问题标题】:Using libwebsockets + ssl in asterisk getting error creating ssl context 140A90A1:lib(20):func(169):reason(161)在星号中使用 libwebsockets + ssl 创建 ssl 上下文时出错 140A90A1:lib(20):func(169):reason(161)
【发布时间】:2018-01-28 23:43:32
【问题描述】:

我们在用 c 编写的启用 ssl 的 web socket 客户端程序中使用 libwebsockets 1.3,我们在安装了 openssl 1.0.1 的 Centos 6.5 上编译,制作了一个 .so 库,该库后来在星号中使用。编译正常,但我收到此运行时错误:

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;
}

根据我在网上看到的示例,这看起来非常好,过去几天我一直在摸索,搜索并尝试了一切,包括重新安装不同版本的 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 库,该库用于我们修改后的 asterisk 版本(据我所知,它本身使用 openssl)。

【问题讨论】:

    标签: c openssl centos asterisk libwebsockets


    【解决方案1】:

    创建 ssl 上下文时出现问题 336236705:错误:140A90A1:lib(20):func(169):reason(161)

    这可能有所帮助:

    $ openssl errstr 0x140A90A1
    error:140A90A1:SSL routines:SSL_CTX_new:library has no ciphers
    

    “库没有密码”是库未初始化的确定标志。请参阅 OpenSSL 的关于初始化库的 wiki 页面Library Initialization

    既然 Asterisk 做了一些非常聪明的事情,你应该检查一下它还在做什么。特别是,您应该确保它使用弱/受伤/损坏的协议和密码套件。可以在SSL/TLS Client 找到如何改善安全状况的示例。该示例确保 TLS 1.0 及更高版本,并使用“强”密码套件。

    【讨论】:

      【解决方案2】:

      通过使用使用 boost asio 的库,我也遇到了这个错误。 lib 是针对 openssl-1.0 编译的,而我的二进制文件是针对 openssl-1.1 编译的。

      将我的二进制文件切换为也使用 openssl-1.0 为我解决了这个问题。

      【讨论】:

      • 谢谢!我在 Arch Linux 上使用 cpprest 遇到了这个问题,结果发现 AUR 中的 cpprest 包是硬编码的,可以针对 OpenSSL 1.0 进行编译,而安装的 Boost ASIO 库是针对 OpenSSL 1.1 编译的。修改 cpprest 包的 PKGBUILD 以删除硬编码的 OpenSSL 路径修复了该问题。
      • @SeanBurton 哇!那正是我的问题。拱门上的 cpprest。
      【解决方案3】:

      问题是星号覆盖了所有openssl初始化函数,包括main\libasteriskssl.c中的SSL_library_init()OpenSSL_add_all_algorithms(),并将它们替换为什么都不做的虚拟函数,而是定义了一个ast_ssl_init(),它执行所有初始化并被调用一次在main()main/asterisk.c 中,我的代码恰好在那个调用之前。

      【讨论】:

        【解决方案4】:

        评论太长了,但是:

        首先,让我们删除您的代码。在libwebsockets 分发版中,test/test-server.c 中有一个使用 SSL 的测试服务器。那样有用吗?如果是这样,我猜这是您在代码中所做的事情(在这种情况下,我们将需要您的一些代码)。如果不是,我猜这是你的发行版。

        接下来,让我们将该错误消息提供更多信息。您能否介绍ERR_print_errors_fp() 将SSL 错误打印到stderr 或类似名称,并告诉我们它的含义?

        【讨论】:

        • 感谢 abligh,请参阅我对原始帖子的编辑以及更多信息。
        猜你喜欢
        • 1970-01-01
        • 2020-04-23
        • 1970-01-01
        • 2016-12-12
        • 2016-03-03
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多