多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

EMQX RPM 包 OpenSSL 依赖修复解析:RHEL 9.6 LTS 下的版本锁定策略

EMQX RPM 包 OpenSSL 依赖修复解析:RHEL 9.6 LTS 下的版本锁定策略 后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载导读本文围绕 EMQX 仓库中针对 RHEL 9.6 LTS 发行版的一次 RPM 打包修复fix-16901.en.md深入解析 EMQX 官方 RPM 包如何按 RHEL 小版本为 OpenSSL 运行时依赖设置精确的下限版本约束RHEL 9.7 锁定openssl 3.5.1更早的 RHEL 9 系列锁定openssl 3.0.7。读完本文你将掌握该修复的背景动机、emqx.spec中基于%{?rhel}与%{?dist}宏的条件依赖写法以及 RHEL 9 各阶段 OpenSSL 版本演进的对应关系并能举一反三地理解 EMQX RPM 打包体系的依赖声明方式。一次 OpenSSL 依赖修复修复了什么该变更记录changes/ee/fix-16901.en.md的完整描述只有一句话Fixed RPM package OpenSSL dependency for RHEL 9.6 LTS: pinnedopenssl 3.5.1for RHEL 9.7 andopenssl 3.0.7for older RHEL 9 versions.翻译过来即修复 RHEL 9.6 LTS 下 RPM 包的 OpenSSL 依赖声明——对 RHEL 9.7 及以上版本固定要求openssl 3.5.1对更早的 RHEL 9 版本固定要求openssl 3.0.7。这一修复同时被收录进两个版本的发行说明changes/6.1.2.en.mdDeployment 章节PR #16901changes/6.2.0.en.mdDeployment and Security 章节PR #16901从发布节奏看该修复先进入 6.1.2随后在 6.2.0 的发行说明中再次确认说明这是横跨两个维护分支的打包层缺陷修正。为什么要按 RHEL 小版本区分 OpenSSL 下限RHEL 9 是一个持续演进的操作系统发行版其核心系统库包括 OpenSSL会在小版本更新中升级。RHEL 9 各阶段实际携带的 OpenSSL 主版本如下RHEL 9 阶段系统携带的 OpenSSL 版本EMQX 依赖下限RHEL 9.0 ~ 9.6 及更早 9.xOpenSSL 3.0.x如 3.0.7openssl 3.0.7RHEL 9.7 及以上OpenSSL 3.5.xopenssl 3.5.1修复前EMQX 的 RPM 包对 RHEL 9 仅声明了通用依赖openssl未指定版本下限。这在部分 RHEL 9.6 LTS 及更新环境中可能带来两类问题依赖解析过宽系统可能满足最小安装要求却缺少 EMQX 运行时Erlang/OTP 的 crypto、ssl 应用以及 NIF 层实际需要的 OpenSSL API 特性版本语义不匹配RHEL 9.7 切换到了 OpenSSL 3.5 系列若 RPM 包仍以 3.0 时代的约束去声明依赖在依赖求解如yum/dnf解析时可能得到错误或不一致的组合。修复的核心思路是用 RPM 宏把「RHEL 大版本 小版本」两个维度组合起来为不同阶段的系统分别设置精确的最低版本从而让dnf/yum在安装时就能自动拦截不满足 OpenSSL 版本要求的系统。源码级实现emqx.spec 中的条件依赖声明该修复的落地位置是 RPM 打包规格文件 deploy/packages/rpm/emqx.spec。关键片段如下Requires: libatomic procps which findutils ncurses %if 0%{?rhel} 7 %{_arch} x86_64 Requires: openssl11 %else %if 0%{?rhel} 9 %{?dist} .el9_7 Requires: openssl 1:3.5.1 %else %if 0%{?rhel} 9 Requires: openssl 1:3.0.7 %else Requires: openssl %endif %endif %endif逐行拆解条件分支RHEL 7 x86_64 →openssl11RHEL 7 系统默认只带 OpenSSL 1.0而 EMQX 需要 1.1 API因此引入独立的openssl11兼容包RHEL 9 且%{?dist}.el9_7→openssl 1:3.5.1这是本次修复新增的核心分支针对 RHEL 9.7 及以后小版本号 ≥ 7的系统RHEL 9更早小版本→openssl 1:3.0.7针对 RHEL 9.0 ~ 9.6 等旧小版本其他发行版如 RHEL 8、其他 EL 系→openssl维持无版本下限的通用声明兜底所有未匹配场景。两个关键 RPM 宏的含义0%{?rhel}%{?rhel}展开为当前构建目标所属的 RHEL 大版本号如 9前缀0是为了在宏未定义时得到数值 0避免与字符串比较出错0%{?rhel} 9即「构建目标是 RHEL 9」。%{?dist}展开为发行版标记字符串形如.el9_7。字符串比较%{?dist} .el9_7在 RPM 宏展开阶段即可判断小版本是否达到 9.7从而在%if预处理阶段就选择正确的Requires行最终写入 RPM 包的依赖元数据。值得注意openssl 1:3.5.1中的1:是 OpenSSL 在 RHEL 中采用的 epoch 前缀。RHEL 将 OpenSSL 的 epoch 置为 1因此在 RPM 依赖比较中必须带上 epoch否则版本比较会偏离 dnf 的实际解析结果——这正是精确版本锁定在 RPM 语义下的正确写法。配套打包流程rpmbuild 如何驱动 emqx.spec条件依赖的实际效果依赖 rpmbuild 传入的宏定义见 deploy/packages/rpm/Makefileall: | $(BUILT) cd $(SRCDIR) rpmbuild -v -bb \ --define _package_name $(EMQX_NAME) \ --define _name emqx \ --define _topdir $(TOPDIR) \ --define _version $(RPM_VSN) \ --define _reldir $(SRCDIR) \ --define _post_addition $(POST_ADDITION) \ --define _preun_addition $(PREUN_ADDITION) \ --define _sharedstatedir /var/lib \ --define _service_src $(SERVICE_SRC) \ --define _service_dst $(SERVICE_DST) \ emqx.spec其中两点与依赖声明直接相关版本号归一化RPM_VSN : $(subst -,_,$(PKG_VSN))RPM 不允许版本号中出现-因此 EMQX 版本如6.1.2会被转换为下划线形式后再参与打包系统宏自动注入rhel、dist等宏由 rpm 构建环境chroot 的发行版定义自动提供emqx.spec无需硬编码具体 RHEL 版本号只要在对应发行版的构建机上执行 rpmbuild%if分支就会自动选中正确的Requires行。此外spec 中声明AutoReq: 0deploy/packages/rpm/emqx.spec即关闭 RPM 对二进制文件链接库的自动依赖探测所有运行时依赖都由上述Requires:显式声明——这使 OpenSSL 等关键系统库的版本约束完全由 spec 文件掌控正是本次修复能被精确落实的前提。如何验证与自查安装 EMQX 后可通过以下命令核实 RPM 元数据中的 OpenSSL 依赖约束rpm -q --requires emqx | grep -i openssl在 RHEL 9.7 上应看到openssl 1:3.5.1在 RHEL 9.0 ~ 9.6 上应看到openssl 1:3.0.7在 RHEL 7 x86_64 上应看到openssl11。若系统 OpenSSL 版本低于锁定下限dnf install会在依赖解析阶段直接报错并阻止安装这正是该修复期望达到的效果——把「运行期才发现 OpenSSL 不兼容」提前到「安装期就拦截」。小结本次#16901修复本质上是把 RHEL 9 家族按小版本切分成两段分别锁定 OpenSSL 最低版本RHEL 9.7 要求openssl 3.5.1旧版 RHEL 9 要求openssl 3.0.7。它在 deploy/packages/rpm/emqx.spec 中以%{?rhel}%{?dist}条件宏实现并借助AutoReq: 0让依赖完全由 spec 显式掌控。对于任何需要在 RHEL 9.6 LTS 及后续小版本上部署 EMQX RPM 包的运维人员理解这一依赖声明有助于预判安装阶段的报错原因并正确规划系统 OpenSSL 版本基线。赞分享后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载相关推荐Owncast 自动化升级测试指南如何用最新发布版到本地 HEAD 的单跳升级守护数据兼容性Owncast 自动化升级测试指南如何用最新发布版到本地 HEAD 的单跳升级守护数据兼容性 Owncast 是自托管的直播流媒体服务其数据目录配置文件与音视频直播后端Node.js 18.17.1 (LTS) 安全修复版解读策略绕过 CVE 修复与 OpenSSL 升级实战Node.js 18.17.1 LTS 安全修复版解读策略绕过 CVE 修复与 OpenSSL 升级实战 本篇文章基于 nodejs.org 官网仓库中的 v前端文档Swift大数运算最佳实践BigInt在金融与密码学中的应用Swift大数运算最佳实践BigInt在金融与密码学中的应用 BigInt是一个基于纯Swift实现的任意精度算术库为开发者提供了处理超出标准数据类型范围的创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表