一个引发openssl崩溃问题案例

1 背景

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

2 开发环境

项目库版本号依赖项
libeventlibevent-2.1.8-stableopenssl 1.1
openssl1.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库:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python酷库之旅-第三方库Pandas(024)

目录 一、用法精讲 61、pandas.to_numeric函数 61-1、语法 61-2、参数 61-3、功能 61-4、返回值 61-5、说明 61-6、用法 61-6-1、数据准备 61-6-2、代码示例 61-6-3、结果输出 62、pandas.to_datetime函数 62-1、语法 62-2、参数 62-3、功能 62-4、返回值 62-…

关于SQLException: Illegal mix of collations (`utf8mb4_general_ci,IMPLICIT`)...错误

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 关注 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、报错信息三、最后 开篇说明 记录一个查询错误 场景:数据库之间某表复…

旷野之间 16 – AI 代理、AI 代理基础设施、平台和比较

在本文中,我们将研究 AI 代理、AI 代理基础设施、市场上最流行的 AI 代理平台、它们的比较以及 AI 代理的未来 我们将按以下顺序讨论这些主题 1. 关于人工智能代理 2. 人工智能代理在行业中的应用 3. AI代理基础设施 4. 最受欢迎的 AI 代理平台及比较 5.您将如…

【笔记】nginx命令

查看 启动 通过./nginx启动nginx之后 可以在虚拟机中进入/usr/local/nginx/html 去查看cat index.html 也就是此页面的源代码 进入vim /etc/profile 配置完之后保存退出 source /etc/profile 手动重载资源 随后就可以在任意位置重载资源了 nginx -s reload 部署静态资源就把静…

两项国际设计奖,支持双设备—悠律Ringbuds pro开放式蓝牙耳机体验

在音频设备领域,开放式耳机对比入耳式耳机的优势就是既能听到耳机内的声音又能感知环境音,很适合在户外以及办公时使用,今天分享一款新品牌悠律UMELODY——悠律凝声环Ringbuds pro,它采用气传导耳挂式设计,佩戴舒适、安…

【人工智能】 知识表示与推理(八数码 + 传教士与野人渡河)

目录 一、八数码难题 1. 需求分析 2. 数据结构、功能模块设计与说明 2.1 算法思路 2.2 数据结构 3. 核心代码与测试结果说明 3.1 核心代码 3.2 测试结果说明 4. 存在的问题与体会 4.1 存在的问题 4.2 体会 二、传教士与野人渡河 1. 需求分析 2. 数据结构、功能模…

基于EMQX+Flask+InfluxDB+Grafana打造多协议物联网云平台:MQTT/HTTP设备接入与数据可视化流程(附代码示例)

摘要: 本文深入浅出地介绍了物联网、云平台、MQTT、HTTP、数据可视化等核心概念,并结合 EMQX、Flask、InfluxDB、Grafana 等主流工具,手把手教你搭建一个支持多协议的物联网云平台。文章结构清晰,图文并茂,代码翔实易懂&#xff0…

2024-07-14 Unity插件 Odin Inspector1 —— 插件介绍

文章目录 1 介绍2 模块3 学习目的 1 介绍 ​ Odin Inspector 是 Unity 的一个插件,拥有强大、自定义和用户友好的编辑器,而无需编写任何自定义编辑器代码,使得编程过程中的数据可视化更容易实现。 ​ 具体功能包括: 更舒适美观…

软件设计师(中级)备考视频教程

一、视频介绍 本视频主要包括软件设计师系统学习教程,通过学习本视频,可以帮助考生高效且深入地掌握软件设计师资格考试核心知识,全方位覆盖考试要点,从而轻松备战考试。视频不仅涵盖了考试所需的全面知识体系,还通过直…

Linux--USB驱动开发(二)插入USB后的内核执行程序

一、USB总线驱动程序的作用 a)识别USB设备 1.1 分配地址 1.2 并告诉USB设备(set address) 1.3 发出命令获取描述符 b)查找并安装对应的设备驱动程序 c)提供USB读写函数 二、USB设备工作流程 由于内核自带了USB驱动,所以我们先插入一个U…

Google Colab 云端硬盘路径读取

加载云端硬盘 需要在左上角点击这个文件图标; from google.colab import drive drive.mount("/content/drive") # 挂载云端硬盘import os path"/content/drive/MyDrive/TextClassificationCustom" os.chdir(path) # 以路径path作为当前工作目…

在 SwiftUI 中的作用域动画

文章目录 前言简单示例动画视图修饰符使用多个可动画属性使用 ViewBuilder总结 前言 从一开始,动画就是 SwiftUI 最强大的功能之一。你可以在 SwiftUI 中快速构建流畅的动画。唯一的缺点是每当我们需要运行多步动画或将动画范围限定到视图层次结构的特定部分时&…

docker emqx 配置密码和禁用匿名连接

mqtt版本emqx/emqx:4.4.3 1.首先把镜像内目录/opt/emqx/etc拷贝到本地 2.做映射 3.allow_anonymous, false改成true 4. 5.MQTTX连不上的话看看下图的有没有打开

windows下环境变量开启方式

第一种方法: 使用快捷键打开“运行”对话框:按下 Win R 组合键,这将打开“运行”窗口。 输入系统属性命令:在“运行”窗口中输入 sysdm.cpl 然后按回车键。这将打开“系统属性”对话框。【sysdm.cpl是"System Data Manager…

Linux多线程编程-哲学家就餐问题详解与实现(C语言)

在哲学家就餐问题中,假设有五位哲学家围坐在圆桌前,每位哲学家需要进行思考和进餐两种活动。他们的思考不需要任何资源,但进餐需要使用两根筷子(左右两侧各一根)。筷子是共享资源,哲学家们在进行进餐时需要…

鞭炮插画:成都亚恒丰创教育科技有限公司

鞭炮插画:年味里的绚烂记忆 在岁末年初的温柔时光里,总有一抹色彩,能瞬间唤醒沉睡的年味——那便是鞭炮插画中跃动的红与金,成都亚恒丰创教育科技有限公司 它们不仅仅是纸与墨的交织,更是情感与记忆的桥梁&#xff0c…

自适应手机版大学职业技术学院网站模版源码系统 带完整的安装代码包以及搭建部署教程

系统概述 随着智能手机的普及和移动互联网技术的飞速发展,用户越来越倾向于通过移动设备访问网站。对于大学职业技术学院而言,一个能够自适应各种屏幕尺寸、操作流畅、内容丰富的移动端网站,不仅能够提升用户体验,还能有效扩大学…

mysql快速精通(三)表关系

主打一个实用 一. 一对多(多对一)关系 例如班级和学生,这种类型我们一般建两个表,一方为主表,多方为从表 二. 多对多 例如课程与学生,这种类型我们一般需要建三张表,两张一方主表,与一张多方从表…

初识影刀:EXCEL根据部门筛选低值易耗品

第一次知道这个办公自动化的软件还是在招聘网站上,了解之后发现对于办公中重复性的工作还是挺有帮助的,特别是那些操作非EXCEL的重复性工作,当然用在EXCEL上更加方便,有些操作比写VBA便捷。 下面就是一个了解基本操作后&#xff…

[Linux]CentOS软件的安装

一、Linux 软件包管理器 yum 1.Linux安装软件的方式 在linux中安装软件常用的有三种方式: 源代码安装(我们还需要进行编译运行后才可以,很麻烦) rpm安装(Linux的安装包,需要下载一些rpm包,但是…