我们在用 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: %sn",
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: %sn",
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(。
创建 SSL 上下文336236705时出现问题:错误:140A90A1:lib(20(:func(169(:原因(161(
这可能有所帮助:
$ openssl errstr 0x140A90A1
error:140A90A1:SSL routines:SSL_CTX_new:library has no ciphers
"库没有密码"是库未初始化的明确标志。请参阅 OpenSSL 的 wiki 页面,了解如何在库初始化中初始化库。
由于Asterisk正在做非常聪明的事情,你应该检查它还有什么。特别是,您应该确保它不使用弱/受伤/损坏的协议和密码套件。有关如何改善安全状况的示例,请参阅SSL/TLS 客户端。该示例确保 TLS 1.0 及更高版本,并使用"强"密码套件。
我也在使用使用boost asio的库时遇到了此错误。库是针对openssl-1.0编译的,而我的二进制文件是针对openssl-1.1编译的。
将我的二进制文件切换为也使用 openssl-1.0 为我解决了这个问题。
问题是星号覆盖了所有 openssl 初始化函数,包括 mainlibasteriskssl.c
中的 SSL_library_init()
和 OpenSSL_add_all_algorithms()
,并将它们替换为什么都不做的虚拟函数,相反,它定义了一个执行所有初始化并在 main/asterisk.c
中main()
调用一次的ast_ssl_init()
,我的代码恰好在那次调用之前。
评论太长了,但是:
首先,让我们消除您的代码。在libwebsockets
发行版中,test/test-server.c
有一个使用 SSL 的测试服务器。这行得通吗?如果是这样,我猜这是你在代码中做的事情(在这种情况下,我们将需要你的一些代码(。如果没有,我猜这是你的分配。
接下来,让我们使该错误消息更具信息性。您能否介绍ERR_print_errors_fp()
将SSL错误打印到stderr
或类似错误,并告诉我们它说了什么?