你搜索openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm这串文件名的时候多半不是想研究 OpenSSL 原理而是某个服务起不来、某个依赖装不上或者你正在一堆离线包里抓瞎。我上个月在麒麟 10 环境里部署内部服务时就卡在这个包上一条rpm -ivh敲下去接下来全是依赖缺失、版本冲突、签名校验失败这些连环报错硬生生折腾了大半天才把所有坑填平。这篇文章就是把我这次安装全过程、排障思路和复盘经验整理出来重点不是教你敲哪条命令而是告诉你报错之后怎么判断、哪些操作能碰、哪些操作绝对不能碰。如果你是运维、开发或者正在跟 rpm 依赖死磕这篇非常适合你。动手安装之前我先说句最重要的结论openssl-libs 不是普通应用包它是系统底层核心库装不好会影响 SSH、Nginx、MySQL、curl 等一大堆服务。所以这篇文章会尽量把每一步的为什么讲透而不只是给命令。1. 打开包之前先读懂这个文件名的每个字段1.1 openssl-libs 是干嘛的和 openssl 命令包有什么区别很多人一开始就把概念搞混了。openssl和openssl-libs是两个不同的 RPM 包openssl提供/usr/bin/openssl命令行工具平时用它生成私钥、查看证书、测试 TLS 握手而openssl-libs提供的是libssl.so.1.1和libcrypto.so.1.1这些动态库。为什么这个区别很重要因为像 Nginx、MySQL、Python 的ssl模块它们在运行时不调用openssl命令而是直接链接这些动态库。就算你的openssl命令能正常执行只要libssl.so.1.1缺失或者版本不对应用照样会报类似error while loading shared libraries: libssl.so.1.1: cannot open shared object file的错误。我个人的理解方式openssl命令像一个前台窗口openssl-libs才是支撑整个房子运转的地基。上面的服务都依赖地基地基一换上面的楼层都要跟着确认一遍稳不稳。1.2 文件名里每个字段都是什么意思拿这个包名逐段拆解字段含义对安装的影响openssl-libs包名表示这是 OpenSSL 运行时库包不是命令行工具包1.1.1f上游 OpenSSL 版本号1.1.1 系列f 是 2019 年 3 月发布的修订版-4RPM 构建号发行商第 4 次重新打包p12补丁级别厂商打到了第 12 个补丁ky10目标系统Kylin Linux 10即麒麟 10x86_64CPU 架构只能装在 64 位 x86 平台看到ky10就该明白这个包是针对麒麟 10 定制的。虽然从 CentOS 那边拿一个openssl-libs也许能强行装上但 glibc 版本、soname 和补丁集的差异可能导致运行时出现未定义符号。离线环境下想少折腾就老老实实找对应系统版本的包。1.3 什么场景下你会需要手动装这个包根据我接触到的现场情况常见场景有这么几类部署 MySQL 8 / MariaDB 时mysqld在启动时报警告或直接报错提示需要libssl.so.1.1或libcrypto.so.1.1。某个自研服务是从编译环境直接搬过来的运行机器上没有对应版本的 OpenSSL 运行时库。安全合规整改要求把 openssl-libs 升级到 1.1.1f 以上去掉旧版本漏洞。内网离线环境所有安装包都得用光盘或 U 盘拷进去没有 yum 源可以临时拉依赖。这些场景里你才真正需要跟这个 rpm 包打交道。下面先讲安装路径的选择因为这一步没选对后面全是折腾。2. 装不装得成取决于你的安装路径选对了没有2.1 动手之前先确认这三件事第一件事是确认系统身份。装上后不能随便乱覆盖先看系统到底是不是 Kylincat /etc/os-release cat /etc/kylin-release 2/dev/null uname -m第二件事是确认架构。x86_64包只能装到 64 位系统uname -m如果输出aarch64那你手里的包是装不上的。别硬装也别想用--force绕过架构不匹配的 RPM 会让文件放到错误路径后果比依赖报错更隐蔽。第三件事是检查系统里目前是否已经装了 openssl-libsrpm -qa | grep openssl如果有旧版本输出先把旧版本 RPM 文件备份出来留着回滚用。我第一次装的时候嫌麻烦没做备份后来想回滚发现旧包早没了只能到处找源非常被动。2.2 能联网就优先用 yum localinstall而不是直接 rpm如果机器能访问 yum 仓库最稳的是这一条yum localinstall ./openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpmlocalinstall是 yum 专门为本地包 远程依赖设计的操作。它以你手头的这个 RPM 为基准把缺失的依赖自动从仓库里拉下来并进行排序比rpm -ivh省心太多。用 dnf 的系统也可以直接写dnf install ./openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm注意./这个路径前缀它告诉 yum/dnf 你要处理的是当前目录下的本地文件而不是去仓库里搜索这个名字。少了./yum 可能会因为仓库里没有这个精确版本而报No match for argument。2.3 离线环境再用 rpm -ivh 直接装离线环境没办法拉远程依赖最基础的操作就是这样rpm -ivh openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm它只会安装这个包本身。如果系统缺依赖会直接抛出failed dependencies列表这时候你需要手动准备依赖包。这也是后面第 3 节重点讲的部分。顺手补充一下装之前可以用rpm -ip干跑一次不加-v和-h只看它会不会报依赖问题不会真的动手写系统。这个技巧在批量检查一堆包时特别好用。2.4 -ivh 和 -Uvh别把安装做成升级-ivh意思是 install适合系统里原本没有这个包的情况-Uvh意思是 upgrade适合从旧版本升级到新版本。两者看着像实际行为有差别参数含义典型场景潜在风险rpm -ivh 包.rpm全新安装系统中还没有 openssl-libs如果已存在同版本会报already installedrpm -Uvh 包.rpm升级安装系统中已有旧版想升到 1.1.1f可能移除旧版提供的兼容库文件rpm -Uvh --oldpackage 旧包.rpm降级回滚新装版本有问题要回退需要提前留好旧 rpm 文件rpm -ivh --replacepkgs 包.rpm强制重装包文件损坏但版本相同不处理依赖问题我见过有人习惯性看到 rpm 文件就敲rpm -Uvh结果升级完成后老版本提供的libssl.so.10被删掉了而系统里还有一堆依赖旧库的服务没升级直接全部罢工。升级前建议先看一下当前环境的动态库情况ldconfig -p | grep -E libssl|libcrypto如果当前环境同时有.so.10和.so.1.1两种库说明新旧接口都在用升级时要特别小心-Uvh是否会清理旧文件。提示无论使用-ivh还是-Uvh都建议先确认/usr分区有足够空间并记录当前 rpm 包版本安装前做好回滚准备。3. failed dependencies 才是常见拦路虎四种解决策略3.1 先搞清楚这个包到底依赖什么在安装之前可以用这条命令把依赖关系全部打出来rpm -qpR openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm输出会是一长串比如libc.so.6()(64bit) libcrypto.so.1.1()(64bit) libdl.so.2()(64bit) libpthread.so.0()(64bit) rpmlib(CompressedFileNames) 3.0.4-1 ...这里有个关键概念libcrypto.so.1.1()(64bit)不是指某个具体路径而是 soname。每个动态库都有一个 soname它不随路径变化而变化。rpm 在检查依赖时只关心系统里能不能解析到这个 soname不关心它在/usr/lib64还是/usr/lib下。想快速看系统里目前能解析哪些库用ldconfig -p | grep -E libssl|libcrypto如果没有输出说明对应的动态库尚未注册系统当然会报缺失。3.2 判断缺的是系统基础库还是 openssl 自身相关库依赖列表里两类情况要区分开第一类缺的是libc.so.6、ld-linux-x86-64.so.2这种系统基础库。这种情况通常说明 glibc 有问题或者是机器本身不完整。此时问题不在 openssl-libs而是先要修复基础环境。用yum install glibc或者检查系统完整性不要直接拿 openssl-libs 去试。第二类缺的是libssl.so.10或libcrypto.so.10这种老接口库。它说明你需要的不是 openssl-libs 1.1.1f而是一个兼容包。很多老程序是在 OpenSSL 1.0 环境下编译的运行时需要.so.10而新版 openssl-libs 只提供.so.1.1。这时候正确的操作是补装compat-openssl10而不是把系统 openssl-libs 降级。我踩过的坑就是这里当时 MySQL 5.7 的二进制包报缺libssl.so.10我第一反应是去装高版本 openssl结果环境越搞越乱。后来才明白MySQL 5.7 需要的是老接口补个 compat 包就行两者完全可以共存。3.3 让 yum 帮你解析依赖如果机器有仓库可用让 yum 自己解决依赖是最省力的yum install ./openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpmyum 会把缺失依赖从仓库补齐。如果报没有可用软件包先检查仓库源是否挂了。离线环境可以挂载系统安装 ISO 作为本地 yum 源。简单思路是把 ISO 挂载后写一个.repo指向挂载目录并设置gpgcheck0然后重新yum makecache。这样很多依赖都能从安装介质里直接解析出来比手动一个个找包靠谱。3.4 手动补依赖包不降级就装 compat源里找不到依赖时就得手动补包。典型场景是上面说的老接口缺失yum install compat-openssl10装完之后检查ls -l /usr/lib64/libssl.so.10* ls -l /usr/lib64/libcrypto.so.10*新旧库可以共存因为文件名不同系统会按 soname 分别调用。这也是为什么我建议不要轻易降级 openssl-libs补一个 compat 包往往就解决问题了。如果系统源里连 compat 包都没有就去 Kylin 的安装光盘 packages 目录里找。找到后同样用rpm -ivh先装 compat再装主包。3.5 --nodeps 的代价以及最后时刻才考虑的手段--nodeps可以跳过依赖检查强制安装rpm -ivh --nodeps openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm表面上看包装上去了但系统 rpm 数据库里记录的状态和实际环境不一致。后续你执行yum install或yum update时会频繁看到依赖解析失败或包需要 xx 但是没有安装的提示。更重要的是如果缺失的依赖恰好是运行时的关键库很多程序会直接起不来。我的经验是--nodeps是最后手段不是第一手段。对 openssl-libs 这种核心包我更建议先把依赖列表清点完整把缺的包都补上最后一条正式命令安装。宁可多花 20 分钟找依赖也不要图省事埋下隐患。4. 我只在安装现场见到过的高频报错和排查链路4.1 bash: rpm: command not found这个报错看起来低级但真实环境中确实会遇到尤其是精简安装或某些办公系统镜像。排查思路分两步先看系统里到底有没有 rpmwhich rpm ls -l /usr/bin/rpm如果文件不存在但系统里有 dnf可以直接补dnf install rpmKylin 系统正常情况下会预装 rpm。如果连 dnf 也没有可能不是完整的服务器环境优先从系统安装盘里补装或者检查是不是某个系统目录被清理掉了。还有一种可能rpm 装了但 PATH 没包含/usr/bin。用echo $PATH看一下必要时临时补上export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$PATH4.2 downloading packages 警告缓存损坏用 yum 安装时如果看到类似警告/var/cache/yum/x86_64/7/.../rpm: ...一般不是致命错误但它通常意味着 yum 的本地缓存里有损坏或不完整的 rpm 文件。排查链路是这样运行yum clean all清掉元数据缓存。再手动删掉缓存目录rm -rf /var/cache/yum。重新yum makecache并重试安装。我遇到过一次警告反复出现yum 怎么都装不上。后来发现是仓库地址那边有一个 rpm 文件损坏导致下载的包一直校验失败。换了镜像源后瞬间正常。所以警告如果反复出现除了清缓存也要检查仓库源本身。4.3 依赖包版本冲突尤其是装 MySQL 的时候这个坑搜热词里也很多人踩。安装 MySQL 时最容易遇到两类冲突第一类MySQL 某个版本要求特定版本的 openssl 库但系统仓库里只有新版本。典型的提示是需要: libssl.so.10()(64bit)解决方式是装compat-openssl10。注意 MySQL 8 和 MySQL 5.7 的要求不一样MySQL 5.7 要.so.10MySQL 8 要.so.1.1。安装前用 rpm 探测一下这个 mysql 安装包对整个 openssl 的依赖rpm -qpR mysql-community-server-*.rpm | grep -E ssl|crypto第二类已经有一个更高版本的 openssl-libs 被安装了你手里这个 1.1.1f 看起来更旧yum 报需要安装但是会与其他包冲突。这种时候先看清楚当前版本rpm -qa | grep openssl如果当前版本比 1.1.1f 新就直接用系统现有的没必要强行降级。如果当前版本是 1.0.2 等老版本先确认哪些服务依赖旧库再决定是否升级并且提前备份。4.4 公钥校验失败常见提示The GPG keys listed for the xxxx repository are not installed或者package openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm is not signed这其实是 RPM 的签名检查机制在工作。Kylin 系统通常自带了发行版公钥导入一下就行rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-*如果是内网自己下载的 rpm也可以临时用--nogpgcheck跳过rpm -ivh --nogpgcheck openssl-libs-1.1.1f-4.p12.ky10.x86_64.rpm但--nogpgcheck只适用于你能确认来源可信的包。如果是从非官方渠道拿的先核对 MD5/SHA256 再操作。4.5 磁盘空间不足导致的解包中断卸载日志有时长这样error unpacking rpm package xxx.rpm: cpio: read error先看空间df -h /RPM 解包时会先在临时目录里写文件然后再移动到目标路径。/分区或/usr分区空间不足都会中断。清理/var/cache/yum、旧的日志文件和临时文件后再试一次。这个报错还有个隐蔽诱因如果/tmp被设置了严格权限或者被 mount 成 noexecrpm 也可能在解压阶段失败。检查mount | grep /tmp必要时用export TMPDIR/var/tmp换临时目录。5. 装完之后的验证与回退比安装本身更值得做5.1 用 rpm 和 openssl version 确认安装状态安装完成后第一件事是看 rpm 数据库里是否正常rpm -q openssl-libs输出应该包含openssl-libs-1.1.1f-4.p12.ky10.x86_64。然后执行openssl version。但要注意openssl命令的版本和libssl库的版本不一定完全对应命令行工具可能链接的是另一个路径下的库。所以还要继续做下一层验证。5.2 用 ldd 和 ldconfig 验证链接关系动态库装好了还要确认系统里的程序真的能加载到它ldd /usr/bin/openssl ldconfig -p | grep -E libssl|libcrypto正常时应看到类似libssl.so.1.1 /usr/lib64/libssl.so.1.1 libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1如果哪一项显示not found说明动态链接器还没更新缓存执行ldconfig再查。对生产环境还要抽查几个依赖 openssl 的关键服务。比如 Nginxldd /usr/sbin/nginx | grep sslMySQLldd /usr/sbin/mysqld | grep ssl这些可执行文件如果能正常解析到libssl.so.1.1说明整个链接链路通了。5.3 回退到旧版本保留随时后悔的权力新版本装上后如果发现兼容性问题不要硬扛。只要有备份回退很快。回退命令rpm -Uvh --oldpackage /备份目录/openssl-libs-旧版本.x86_64.rpm回退完成后必须重启相关服务不能只替换文件systemctl restart sshd systemctl restart nginx systemctl restart mysqld为什么必须重启因为运行中的进程通常已经加载了旧的库文件句柄即使磁盘文件被替换进程内部使用的还是内存里的旧库。不重启就等于没回退而且新旧状态混杂排查起来更痛苦。5.4 别忘了依赖它的邻居们openssl-libs 底下挂着一大串邻居curl、wget、Git、Python、Nginx、Apache、Postfix、SSH。升级之后应该花几分钟把这些工具都冒烟一遍。比如curl -I https://example.comssh -Vpython3 -c import ssl; print(ssl.OPENSSL_VERSION)。如果某个服务出现 TLS 握手失败、证书加载异常八成是库版本和预期不一致。此时检查它的ldd输出和启动日志往往能很快定位。6. 离线环境一次集齐依赖包的实用技巧6.1 在一台能联网的机器上把依赖全部拉下来内网环境最痛苦的是依赖零散装一个包要试好几次。解决办法是在一台能联网、系统同为 ky10 的机器上一次性把所有依赖拉下来。先装 yum-utilsyum install -y yum-utils然后使用yumdownloader --resolve openssl-libs它会把 openssl-libs 和所有相关依赖全部下载到当前目录。如果你更喜欢yum install --downloadonly的写法yum install --downloadonly --downloaddir/root/openssl-deps openssl-libs下载完用ls -l确认一下重点看有没有 compat 包和 glibc 相关依赖。6.2 批量安装时注意顺序和架构把依赖包拷贝到目标机器前先在同一目录里执行uname -m确认都是 x86_64。然后执行yum localinstall /root/openssl-deps/*.rpmyum localinstall *.rpm会自己排序依赖并且比手动rpm -Uvh *.rpm安全。手动执行 rpm 时shell 的展开顺序不一定符合依赖关系很可能先装主包后装依赖同样报failed dependencies。如果目标机器没有 yum 环境只能用 rpm 逐个装那就按依赖列表从底往上装先装 compat、再装基础库最后装主包。顺序错了就退回来重新排别用--nodeps硬闯。6.3 最后说点实际建议我自己经过这次折腾养成了几个习惯写出来供你参考。第一个习惯是装任何系统级 rpm 之前先备份。哪怕只是把现有包rpm -qa结果和旧版 rpm 文件存到一个目录回退时都会省很多事。第二个习惯是优先用正版仓库源和官方渠道的包。不要从陌生网站下载同名 rpmOpenSSL 这种核心库如果被人植入恶意代码后果是灾难性的。下载后先rpm -Kp 包.rpm检查签名再决定是否安装。第三个习惯是不把--nodeps当作常规操作。依赖问题不是靠跳过它解决的而是靠找到正确的依赖包解决的。每次想敲--nodeps的时候提醒自己今天偷的懒后面会加倍还回来。回看整个过程openssl-libs 这个包并不复杂真正的复杂度在于它牵一发动全身。只要安装前把包名解析清楚、安装路径选对、依赖关系理清、装完做好验证和回滚准备这串看似吓人的 rpm 报错其实每一步都有章可循。你也一样能把它放平。
阅读完成 · 觉得有帮助?