在星号中使用libwebsockets + ssl获取创建ssl上下文的错误140A90A1:lib(20):func(169):reason(161)

时间:2014-12-22 10:30:57

标签: c openssl centos asterisk libwebsockets

我们在用c编写的ssl启用的web套接字客户端程序中使用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库,该库用于我们修改后的星号(据我所知,它本身使用openssl)。

4 个答案:

答案 0 :(得分:2)

  

创建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及更高版本,并使用“强”密码套件。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

评论太长了,但是:

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

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

答案 3 :(得分:0)

问题是星号覆盖了所有openssl初始化函数,包括SSL_library_init()中的OpenSSL_add_all_algorithms()main\libasteriskssl.c,并将它们替换为不执行任何操作的虚函数,而是将ast_ssl_init()定义为main()执行所有初始化并在main/asterisk.c的{​​{1}}中调用一次,我的代码恰好在该调用之前。