☰
麒麟v10安装openssl-libs解决依赖缺失问题全记录
2026/10/2 14:17:20 网站建设 项目流程

先给大家看一个我最近真实遇到的现场:拿到一台装了麒麟 v10 的机器,准备把一个用到了 OpenSSL 的数据库客户端部署上去。结果一执行就说缺少libssl.so.1.1,顺着报错去查,发现系统里连openssl-libs这个基础的库包都没装全。最后问题就集中到了一个包上:openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm。

这类问题并不少见。只要你是用 RPM 体系装软件,不管是装数据库、装编译好的程序,还是拿别人打好的二进制包,十有八九都会撞到 openssl 相关的依赖。这篇文章就是我实操下来的完整记录,包括怎么判断系统适不适合装这个包、依赖报错怎么拆解、哪些--nodeps能碰哪些不能碰、装完怎么验证,以及几个最常见的救场技巧。希望对踩在同一个坑里的朋友有帮助。

1. 为什么需要 openssl-libs:一次真实的依赖事故现场

1.1 这个 RPM 包到底是个什么东西

先把这个包名拆开看,理解清楚它是什么,后面排查思路就顺了。

openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm这个名字包含 5 段信息:

  • openssl-libs:包名。它不是给你敲命令行用的openssl工具,而是 OpenSSL 的运行库文件,主要是libssl.so和libcrypto.so这一系列动态链接库。很多程序在运行时会去加载这些库来完成加密通信、签名验证、随机数生成等工作。
  • 1.1.1f:OpenSSL 的版本号。1.1.1 是一个 LTS 长期支持分支,f是补丁版本。程序会要求你的库里至少包含对应的符号和功能,版本太老不行,隔代大版本也通常不兼容。
  • 4.p12:这个包在发行版里面的发布序列号,可以理解为这个发行版对上游 OpenSSL 打的补丁级别。
  • ky10:表示这是针对麒麟 v10 系统构建的包,它依赖的 glibc、系统库版本都是按麒麟 v10 的环境对齐的。
  • x86_64:CPU 架构,64 位。

一句话总结:这个包是给麒麟 v10 x86_64 系统提供 OpenSSL 1.1.1f 运行库的 RPM 包。大部分程序本身不带 OpenSSL 库,它们靠动态链接的方式,运行时去系统目录里找这些.so文件。系统里缺了它,你装什么都可能报“找不到 libssl.so.1.1”。

1.2 哪些场景最容易撞上这个坑

根据我自己的经验,下面几类场景是最容易跟这个包打交道的:

  • 安装 MySQL、MariaDB 等数据库:数据库二进制包在启动时通常需要libssl来做连接加密。很多朋友是从网上下载的通用二进制 tar 包,不依赖发行版仓库,这时候系统里如果没有 openssl-libs,启动直接失败。
  • 安装开发编译产物:同事用较新版本的 OpenSSL 编译出来的程序,拷贝到麒麟 v10 上运行,可能提示version 'OPENSSL_1_1_1f' not found。
  • 安装第三方仓库提供的 RPM:有些源里的包写了Requires: openssl-libs >= 1.1.1,系统默认仓库如果没有对应版本,yum 就会卡在依赖检测上。
  • 离线环境批量部署:内网机器不能直接联网,只能靠手工 RPM 包安装,这时候依赖包必须自己备齐,openssl-libs 就是最常见的一个。

1.3 版本与架构为什么不能乱选

依赖问题的本质是“程序需要什么,系统就得不给什么”。OpenSSL 的库文件存在很严格的兼容关系:

  • 版本号不同不能互相替代:libcrypto.so.1.0.0和libcrypto.so.1.1是两个不同的库文件名,即便名字看着像,也不能混着用。程序在编译时记录的是它需要的符号版本,比如OPENSSL_1_1_1f,你装一个 1.0.2 的库,加载时就会报version not found。
  • 架构必须对应:x86_64 系统里如果混入 i686 的库,运行时会报“试图加载格式不正确的程序”,这在 Windows 上常见,Linux 下同样有。所以包名里的x86_64不是装饰,真要看清了再下。
  • ky10 的包尽量用 ky10 的版本:麒麟 v10 的包会依赖特定版本的 glibc、特定的系统库路径。你拿 CentOS 7 的 openssl-libs 强行装到麒麟上,依赖关系往往对不上,反而会引出更多报错。

2. 安装前的准备:先摸清你家系统的脾气

2.1 确认系统版本和架构

拿到一个 rpm 包,不要急着rpm -ivh。先确认系统基础信息,这一步能帮你排除至少一半的坑。

cat /etc/os-release cat /etc/kylin-release 2>/dev/null uname -m rpm --eval %{_arch}

我一般会跑前两条看系统发布版本,再跑uname -m看架构。rpm --eval %{_arch}输出的结果会直接告诉你当前 RPM 体系认的架构名称。如果返回x86_64,那安装x86_64的包就是对的;如果返回aarch64,那你手头这个 x86_64 的包先别装,得去下对应架构版本。

安装前确认这个动作,就像搬家前先确认新房门尺寸,工具不对,后面全是白干。

2.2 检查当前 openssl 相关包的状态

很多人分不清openssl命令行工具和openssl-libs运行库的区别,上来就先openssl version看一眼,发现系统里有 openssl,就觉得库也一定在。实际不是这么回事。

我用这条命令看全部相关包:

rpm -qa | grep -E "openssl|ssl"

正常输出里通常会看到类似这些:

  • openssl-1.1.1f-3.p01.ky10.x86_64
  • openssl-libs-1.1.1f-4.p12.ky10.x86_64

如果你只看到openssl包而没有openssl-libs,那说明系统里装了命令行工具,但库文件没有完整注册进 RPM 数据库。这个状态最阴险:你手动拷贝过库文件进去也能运行,但 rpm 依赖检查时照样说缺包。

检查库文件本身也可以直接看路径:

ls -l /usr/lib64/libssl.so.1.1 /usr/lib64/libcrypto.so.1.1 ldconfig -p | grep libssl

ldconfig -p如果看不到libssl.so.1.1,那说明库没有进系统缓存,即使文件在那里,程序也找不到。

2.3 三种安装姿势怎么选

假设你已经拿到了openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm,选择哪种方式安装,结果差别不小。我把三种方式放在一起对比:

安装方式命令示例适用场景注意点
直接安装rpm -ivh openssl-libs...rpm系统里没有相关包,依赖满足缺依赖时会直接失败并列出缺失项
升级安装rpm -Uvh openssl-libs...rpm系统里已经有旧版本,想替换可能触发连锁升级,需谨慎
使用 yum 本地安装yum install ./openssl-libs...rpm想自动解析同仓库里的依赖自动装依赖,也可能自动升级别的包

我个人在离线环境里最常用的是rpm -ivh,因为它行为最可预期,只会安装这一个包,不会自作主张把其他组件一起升级。但如果系统里已经有旧版的openssl-libs且版本比新包低,-ivh会报“已安装的软件包较旧”或者提示“软件包已被安装”。这时候不是不能装,而是要考虑是否真的要覆盖升级。

yum install ./包名.rpm的好处是会从你配置的仓库里自动解析依赖,但坏处是它可能把其他相关包也升级到仓库里对应的版本,生产环境里要留意。

3. 依赖问题详解:那些恼人的报错到底在说什么

3.1 依赖检测失败时的报错拆解

离线安装最常撞见的一类错误长这样:

错误:依赖检测失败: libcrypto.so.1.1()(64bit) 被 openssl-libs-1.1.1f-4.p12.ky10.x86_64 需要 libssl.so.1.1()(64bit) 被 openssl-libs-1.1.1f-4.p12.ky10.x86_64 需要

这段提示其实非常直白:你需要安装的这个包,在运行时要用到对外提供的libcrypto.so.1.1和libssl.so.1.1两个动态库,而当前系统里没有任何已安装的包提供它们。

这里要理解一个关键点:libcrypto.so.1.1()(64bit)里的64bit是 RPM 的架构标记,表示这是一个 64 位库。如果系统缺少的是 32 位库,你会看到libssl.so.1.1()(32bit),这时候你不能用一个 x86_64 的 openssl-libs 去满足,要么装兼容库,要么确认这个 32 位程序是否非装不可。

3.2 怎么用 rpm -qpR 查清依赖清单

在安装前先查一下包的依赖,可以避免盲人摸象。

rpm -qpR openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm

输出可能包含:

/bin/sh /sbin/ldconfig config(openssl-libs) = 1.1.1f-4.p12.ky10 libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libcrypto.so.1.1()(64bit) libssl.so.1.1()(64bit) rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1

如果一堆GLIBC_x.x依赖,就涉及到 glibc 版本问题。一般来说 ky10 自带的基础环境能满足大部分依赖,真正缺的多半是你后来装的其他乱七八糟的库。把这些依赖记录下来,再去挨个确认系统里有没有,是排查依赖问题最扎实的办法。

3.3 依赖缺失时怎么补齐

确认缺哪些依赖之后,常规思路是找到提供这些依赖的包。比如缺libssl.so.1.1,就可以用:

yum provides "*/libssl.so.1.1"

或者:

rpm -qf /usr/lib64/libssl.so.1.1

如果系统里已经有这个文件但 RPM 数据库里没记录,rpm -qf会提示“文件未被任何软件包安装”,这时依赖检测依然会失败。这种“文件在但包不在”的情况,处理办法是找一个能提供这个文件的包补装一遍,而不是手动跳过依赖。

离线环境下,常见的依赖来源有三个:

  • 系统安装镜像里自带的 RPM 包,挂载镜像后直接从/mnt/cdrom/Packages或类似目录里找。
  • 和这个包同一个发布批次里的其他依赖包,通常发布者会放在同一个目录下。
  • 已经装好的同版本系统里,把对应 RPM 备份出来。

拿到一堆依赖包后,可以一次性安装:

rpm -ivh *.rpm

这种方式会把当前目录下所有 RPM 一起安装,RPM 会自己尝试解析它们之间的依赖关系。注意,这方法只有在目录里依赖包齐全时有效,缺一个照样失败。

3.4 --nodeps 到底能不能用

--nodeps是很多人拿来“硬闯”的选项。命令长这样:

rpm -ivh --nodeps openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm

我先把结论放在这儿:--nodeps是把双刃剑,用之前必须想清楚。

什么时候可以碰--nodeps:

  • 你知道系统里其实已经有了对应库文件,只是 RPM 数据库没记录,比如通过手动解压方式放置过库文件。
  • 你对这个包非常了解,明确知道依赖缺失不会影响核心运行,比如--nodeps安装一个纯数据包。

什么时候绝对不能碰--nodeps:

  • 依赖的库文件完全不存在,强行装完后程序运行到一半才报“找不到符号”,到时候排查比依赖报错麻烦得多。
  • 涉及 glibc、libstdc++ 这类基础库的包,强行跳过依赖可能导致整个系统命令都跑不起来。
  • 在不清不楚的状态下,用--nodeps把包硬装进去,RPM 数据库就会出现“包已安装但依赖不满足”的半成品状态,后面你再装其他软件,yum 会一直告诉你 dependency problem。

更严重的是,如果你硬装了一个伪造的.so文件进去,可能会覆盖掉系统里正常的库,导致其他程序连环报错。所以我的习惯是:--nodeps永远只作为最后手段,且装完必须立刻验证。

4. 安装实操与验证:从下载到确认可用

4.1 先备份再动手

覆盖升级 openssl 相关的包,属于动系统基础库的操作。虽然 1.1.1f 到 1.1.1f 这种小版本替换风险不高,但稳妥起见,我建议在安装前把现有状态留个底:

cp /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1.bak 2>/dev/null cp /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1.bak 2>/dev/null rpm -qa | grep openssl > /tmp/openssl-packages-before.txt

备份不用多复杂,主要是留一条退路。如果你操作的生产环境特别严格,最好连同/etc/pki/tls目录一起备份,因为 openssl 相关的证书配置也可能受到影响。

4.2 一步一步安装

确认没有旧版本冲突后,执行:

rpm -ivh openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm

如果系统里已有更旧版本的 openssl-libs,会提示“the package is already installed”或者“newer version is already installed”。这时如果确定要替换,就用:

rpm -Uvh openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm

如果提示缺少其他依赖,而你能拿到依赖包,把依赖包和这个包放在同一目录下,一起执行:

rpm -ivh *.rpm

如果提示信息里出现了%post脚本执行失败或者ldconfig相关报错,先别慌。先看后续能否正常加载库文件,很多发行版的%post脚本只是刷新缓存,失败了可以手动补跑:

/sbin/ldconfig

如果ldconfig命令报错,说明系统的动态链接器配置出了问题,检查/etc/ld.so.conf和/etc/ld.so.conf.d/下是否有损坏的配置。

4.3 安装后重点验证

装完包不等于事情结束,必须验证库能被正常加载。我每次装完都会按顺序跑这组检查:

rpm -qa | grep openssl-libs rpm -ql openssl-libs | grep "\.so" ldconfig -p | grep -E "libssl|libcrypto" openssl version ldd /usr/bin/openssl
  • rpm -qa | grep openssl-libs:确认包已经进入 RPM 数据库。
  • rpm -ql openssl-libs:列出包内文件,确认库文件位置在/usr/lib64。
  • ldconfig -p | grep -E "libssl|libcrypto":确认动态库缓存里有这两个库。
  • openssl version:确认命令行工具正常工作。
  • ldd /usr/bin/openssl:确认命令行工具能正确链接到库文件。

上面检查都通过,这个包基本就是装好了。但别忘了测试实际程序能不能用,最简单的方式是写一个临时证书请求测试加密流程:

openssl req -new -newkey rsa:2048 -nodes -keyout test.key -out test.csr -subj "/CN=test"

这个命令成功跑完,说明 OpenSSL 的底层库和工具链是协同工作的。

4.4 注意升级替换陷阱

很多人在这一步踩坑:用rpm -Uvh安装 openssl-libs,结果发现系统的openssl命令行也被替换了,或者系统里其他老程序突然开始报错。

原因在于,OpenSSL 整个组件是关联在一起的,openssl-libs升级后,openssl工具如果版本低于库的版本,可能会出现“命令版本和库版本不一致”的警告。反过来,如果你把库版本升得很高,某些按旧版本编译的老程序反而会加载不了。

所以升级前一定要想清楚一个问题:你到底是只想补一个缺失的库,还是想升级整个 OpenSSL 组件。

如果只是为了满足某个程序的依赖,尽量保持系统原有组件的版本,不要因为装一个包就把整个 OpenSSL 链条升级一遍。如果确实是系统组件升级,建议把openssl、openssl-libs、openssl-devel这些配套包一起升级,避免版本撕裂。

5. 常见问题与排查技巧实录

5.1 实战场景速查表

把我在实际操作中遇到最多的几类问题列成表,方便大家对照:

报错现象可能原因处理方向
error while loading shared libraries: libssl.so.1.1系统没有安装 openssl-libs装 openssl-libs 或找到提供该库的包
version 'OPENSSL_1_1_1f' not found系统库版本低于程序编译时要求升级库到对应版本,或重新编译程序
依赖检测失败,提示libcrypto.so.1.1()(64bit)缺少运行库或未注册进 RPM补齐依赖包,不用--nodeps硬扛
libssl.so.1.1: wrong ELF class32 位程序加载了 64 位库检查包架构,安装 32 位兼容库
程序能运行但经常 SSL 握手失败证书路径或加密策略问题检查/etc/pki/tls/certs和系统加密策略
openssl: relocation error多个版本的 libssl 混在一起清理环境变量或清理掉多余的旧库
rpm 命令找不到环境变量被清空或 rpm 被误删用绝对路径/bin/rpm或恢复基础软件包
装完后其他程序开始报错升级了过新版本的 openssl 库回滚库版本,保留系统配套版本

5.2 细节:rpm 命令找不到了

有时候你连安装工具都找不到了,提示bash: rpm: command not found。这看起来非常吓人,但原因通常没那么严重,可能是PATH环境变量异常,也可能是基础包被误删。

先试绝对路径:

/bin/rpm --version /usr/bin/rpm --version

如果绝对路径能用,说明只是环境变量问题:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH

如果/usr/bin/rpm已经不存在,那事态就严重多了,可能需要从救援模式或者同版本系统里拷贝 rpm 软件包回来重新安装。这里想提醒一句:日常别乱动基础包,用到--nodeps强删的人,翻车概率极高。

5.3 库文件已存在但程序还是报找不到

这个坑在离线安装里出现频率非常高。你查了/usr/lib64/libssl.so.1.1,文件明明就在,但程序执行时还是说找不到。

原因十有八九是动态链接器缓存没更新。你可能是手动拷贝或解压的库文件,没有跑过ldconfig。

处理方式:

/sbin/ldconfig ldconfig -p | grep libssl

执行后如果能看到libssl.so.1.1,问题基本解决。如果还是没有,检查库文件是否在/etc/ld.so.conf或/etc/ld.so.conf.d/声明的目录里。不在的话可以建软链接或者把文件放进标准库目录。

另一个可能:程序用了 RPATH 或LD_LIBRARY_PATH指定的路径,那个路径下有一个损坏或不完整的库。排查时可以用:

LD_DEBUG=libs ./你的程序

这个命令会输出所有库的加载过程,能看出它到底在找哪个路径、为什么没加载成功。信息量很大,但排查库问题时特别好用。

5.4 openssl 版本不匹配报错处理

程序报version 'OPENSSL_1_1_1f' not found的常见背景是:程序在别的机器上编译时,链接的是较高版本的 OpenSSL,而当前系统的库版本不够。

这不是简单缺包问题,而是版本兼容问题。可选方案有三个:

  • 找到一个对应当前系统版本的 openssl-libs(比如 1.1.1f),满足程序对符号版本的要求。
  • 下载同样支持该版本符号的发行版配套包,注意别把系统自带版本搞得过新。
  • 如果程序有源码,直接在当前系统上重新编译,这是最稳的。

我个人尽量选择第一种。因为它只影响库文件,不会让整个系统的 OpenSSL 大版本跳跃。

5.5 签名校验与包完整性确认

离线拿到 rpm 包后,我习惯先看包文件有没有问题:

rpm -K openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm rpm -V openssl-libs

第一条命令会检查包的 GPG 签名和完整性摘要,如果输出里有NOKEY,说明当前系统没有导入对应的公钥,但不一定代表包损坏,只是无法验签。第二条命令用来验证已安装文件有没有被篡改,比如S.5....T之类的标记,能告诉你文件内容、大小、时间戳被改动了。

会做这个检查是因为我吃过亏:同一个文件名,从不同渠道拿到的包内容可能不一样,装完之后行为也完全两样。宁可花几秒钟验一下,也别让自己处于“包怎么装上的都不知道”的状态。

5.6 装完后的长期维护建议

openssl-libs 装完之后,后面别再把系统折腾成一锅粥。我提几个实际建议:

  • 不要随便用外来的高版本 OpenSSL 覆盖系统自带的库,除非你非常清楚后果。
  • 定期用rpm -Va做一遍包文件校验,特别是在排查诡异问题之后。
  • 如果系统有软件仓库可用,尽量优先从仓库安装依赖,不要靠手工 RPM 堆。
  • 在生产环境里,给关键目录如/usr/lib64做好权限控制,防止普通用户往里塞损坏库文件。
  • 把离线安装用到的所有 RPM 包和版本号记录到文档里,下次遇到同样问题直接按文档操作,能省很多时间。

我在实际部署中还会顺手写一个部署脚本,把这些安装、验证命令固化下来。这样不管是新装机器还是恢复环境,都能快速复制操作,也方便后来的人排查。

这个内容后续还可以这样扩展:如果你在公司内部有多台同配置机器,完全可以把这个包和依赖一起放到内网软件仓库里,用 yum 仓库方式统一分发,省去每台机器手工安装维护的麻烦。第一次手工处理依赖也是这个思路的基础,摸清了依赖关系,后面自动化就水到渠成了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询