一个引发openssl崩溃问题案例

1 背景

最近用libevent写了一个https代理功能,在调研的时候,遇到了一个项目用到了本地多个openssl库引发的ssl握手崩溃问题。

2 开发环境

|----------|-----------------------|-------------|
| 项目库 | 版本号 | 依赖项 |
| libevent | libevent-2.1.8-stable | openssl 1.1 |
| openssl | 1.0u / 1.1.1w / 3.3.1 | ...... |

3 问题现象

https代理的下游是http客户端( 播放器)连接,上游服务器是https对接,其中https对接上游需要用到openssl库。

这在播放器打开该播放url并回溯到上游点播服务器的时候,崩溃堆栈直接到了openssl库内部。

以下是出问题时的堆栈现场:

4 原因分析

为了简单起见,抽离了业务代码,直接用openssl的api写了一个简单的demo,去连接上游https服务器,发现同样存在崩溃现象,并且崩溃的堆栈都一样。

列出demo的主要代码:

复制代码
int main (int argc, char* argv[]) {
    /* 初始化SSL协议环境 */
    // SSL_library_int();
    /* 创建SSL上下文 */
    SSL_CTX *ctx = SSL_CTX_new (SSLv23_client_method());
    if(ctx == NULL) {
       return false;
    }
    /* 设置SSL选项 */
    SSL_CTX_set_options (ctx,
                        SSL_OP_SINGLE_DH_USE |
                        SSL_OP_SINGLE_ECDH_USE |
                        SSL_OP_NO_SSLv2 /*禁用SSLv2*/ |
                        SSL_OP_NO_TLSv1 /*禁用TLSv1*/);
    // 不校验ssl证书
    SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
    int r = bufferevent_openssl_socket_new (base,
                            -1,
                            SSL_new(ctx),
                            BUFFEREVENT_SSL_ACCEPTING,
                            BEV_OPT_CLOSE_ON_FREE);

    // 设置回调函数
    bufferevent_setcb(evcon->bufev, evhttp_read_cb, evhttp_write_cb, evhttp_ssl_error_cb, evcon);
 
    // 启动SSL连接
    bufferevent_socket_connect_hostname(evcon->bufev, dnsbase, AF_UNSPEC, evcon->address, port);
    bufferevent_enable(evcon->bufev, EV_WRITE);

    struct event_base* event_base = event_base_new();
    event_base_dispatch(event_base);
    
    SSL_CTX_free(ssl_ctx);
    return 0;
}

问题原因,当时有2个方向:

  • openssl的api使用不当所致,经openssl的example对比发现无异常;
  • 本地或有多个openssl版本,libevent-2.1.8-stable的编译和链接用到了不同的openssl库所致;

终端执行ls命令查看,的确有多个openssl版本(其实还有openssl的1.0u版本,后来为解决问题卸载了):

5 解决办法

由于libevent-2.1.8-stable版本匹配的openssl版本为1.1版本系列,因此去掉其他openssl版本,保留openssl1.1版本,再编译libevent-2.1.8-stable。

然后在工程文件里引入编译好的libevent库,及其openssl库:

再次编译运行的时候,发现整个世界清净了,可以正常代理播放了:

相关推荐
humiaor4 小时前
Xcode报错:“Set `maskView` to `nil` before adding it as a subview of ZFMaskView
ide·macos·xcode·ios18报错
Decadent丶沉沦10 小时前
mac-M系列芯片安装软件报错:***已损坏,无法打开。推出磁盘问题
macos
SoraLuna13 小时前
「Mac畅玩AIGC与多模态41」开发篇36 - 用 ArkTS 构建聚合搜索前端页面
前端·macos·aigc
有梦想的攻城狮13 小时前
mac本地docker镜像上传指定虚拟机
macos·docker·eureka
深井冰水16 小时前
Pycharm的终端执行allure命令出现command not found
macos·pycharm·接口自动化
黄昏贩卖机16 小时前
mac latex vscode 配置
ide·vscode·macos
亚林瓜子21 小时前
pyenv简单的Python版本管理器(macOS版)
开发语言·python·macos·pyenv
joinclear21 小时前
【问题记录】08 MAC电脑,安装HP打印机驱动,提示:此更新需要macOS版本15.0或更低版本
macos·hp打印机
SoraLuna1 天前
「Mac畅玩AIGC与多模态40」开发篇35 - 用 Python 开发服务对接 SearxNG 与本地知识库
python·macos·aigc
WuYiCheng6662 天前
TLS 1.3黑魔法:从协议破解到极致性能调优
macos