资讯动态

CentOS 7 libssl.so.1.1 缺失修复:腾讯云 RPM 软链接

发布时间:2026/9/16 10:00:55 来源:尧图企业网站定制
只要在 CentOS 7 上跑过第三方编译程序、安装过某些新版中间件你大概率见过这条报错error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory。我第一次遇到时还以为是系统 OpenSSL 坏了折腾半天才发现它根本不是系统自带的库而是某个软件在编译时硬性链接了 OpenSSL 1.1 系列可 CentOS 7 默认只提供 OpenSSL 1.0.2 系列的动态库两边文件名对不上程序自然起不来。这篇文章就围绕这个报错展开。先解释 libssl.so.1.1 缺失的根因再对比几种修复路径最后给出我实际验证过的一套方案——用腾讯云镜像加速下载 openssl11 相关 RPM 包装完再做软链接十分钟内解决问题。如果你是 CentOS 7 用户、正在维护老服务器或者刚接触 Linux 运维这篇内容可以直接拿来用每一步我都尽量写成能复制的命令少踩坑。1. 先搞清楚 libssl.so.1.1 到底是谁家的库1.1 动态链接库与 SONAME 的基础认知在 Linux 里很多程序并不会把所有功能都编译进同一个可执行文件而是把公共代码拆成动态链接库shared library程序启动时由动态链接器去系统目录里找这些库再加载到内存。你可以把这个过程理解成点外卖程序是顾客动态库是菜品动态链接器是外卖员它要按照soname库的版本标识去指定位置取菜。libssl.so.1.1就是 OpenSSL 1.1.x 系列提供的动态库文件对应的还有libcrypto.so.1.1两者通常成对出现。so.1.1这个后缀是 SONAME一眼就能看出它属于 OpenSSL 1.1 分支。程序用 gcc 编译时如果链接器发现头文件和库文件是 OpenSSL 1.1 的就会在可执行文件里写入libssl.so.1.1这个依赖项运行时系统找不到就报出开头那串英文。很多人容易混淆报错文件名里的libssl.so.1.1跟你openssl version命令看到的版本号不是一回事。openssl version看到的是命令行工具版本而动态库文件是另一套命名规则。CentOS 7 上即使把 openssl 命令行升级到 1.0.2k-fips系统里也不会自动出现libssl.so.1.1因为基础库还是 1.0 系列。1.2 为什么 CentOS 7 上偏偏会缺这个文件CentOS 7 的发布周期非常长默认软件仓库里大量软件都基于 OpenSSL 1.0.2 编译系统自带的库文件是libssl.so.10和libcrypto.so.10。老版本稳定、兼容很多线上系统跑了七八年都不动这是 CentOS 7 的优势。但 OpenSSL 1.1 在 2016 年就发布了1.0.2 也在 2019 年底停止了安全维护越来越多新软件、新版本中间件开始基于 OpenSSL 1.1 编译。于是出现了一个很尴尬的错位系统还是 CentOS 7软件却来自新世界。当你用源码编译方式安装了 Nginx、Node.js、某些 Java 原生库、Discuz 扩展、PHP 扩展或者从第三方直接拷贝了一个编译好的二进制程序只要对方编译环境用了 OpenSSL 1.1你本机如果没有对应的 1.1 动态库就会触发libssl.so.1.1缺失报错。还有一种常见情况是与 Docker 相关。有人把 CentOS 8 或 Ubuntu 里跑得好好的二进制文件直接复制到 CentOS 7 容器里执行结果容器里只有 1.0 系列库自然提示找不到 1.1。这个问题的本质不是“系统坏了”而是“运行环境和编译环境不一致”搞清楚这一点后续修复思路就清晰了。1.3 确认问题的三个常用命令在动手修复之前先花一分钟确认到底缺什么、缺到哪种程度。推荐按顺序执行以下三条命令# 1. 查看系统动态库目录里有哪些 libssl 相关文件 ls -l /usr/lib64/ | grep libssl # 2. 查看动态链接器缓存里注册了哪些 libssl 库 ldconfig -p | grep libssl # 3. 用 ldd 查看具体报错程序定位缺失依赖 ldd /path/to/your/program | grep not found第一条命令能看到/usr/lib64/下只有libssl.so.10之类的文件没有libssl.so.1.1第二条命令确认动态链接器缓存里也没有 1.1 的注册记录第三条命令能找到具体是哪个库缺失可能还伴随libcrypto.so.1.1一起缺。如果三条命令都指向同一个结论就可以进入修复环节了。注意有些程序依赖的是libssl.so.1.1的完整路径有些则是通过LD_LIBRARY_PATH指定目录查找。确认时尽量用ldd检查完整依赖链避免只修了 libssl 却漏了 libcrypto结果跑起来又报另一个错。2. 修复方案选型为什么推荐“RPM 镜像下载”而不是马上编译源码2.1 能想到的四种修复路径对比面对libssl.so.1.1缺失不同基础的人会走不同的路。我把常见的四种路径列出来对比一下你会发现多数时候没必要去折腾源码。修复路径优点缺点适合场景源码编译安装 OpenSSL 1.1路径可控可裁剪耗时长依赖 gcc、make、perl容易引入编译错误对版本有特殊要求或需要自定义编译参数从第三方 RPM 仓库安装 openssl11安装快有包管理痕迹部分仓库是社区维护源不一定可靠有可信源或本机已配置对应仓库从 CentOS 8/8-stream 仓库借用 openssl11 RPM腾讯云镜像高速下载依赖少速度快跨版本借用需要评估兼容性绝大多数 CentOS 7 服务器强烈推荐把系统自带 libssl.so.10 软链成 libssl.so.1.1看起来最快一句话搞定严重错误程序加载后极可能段错误崩溃不推荐任何场景都不建议我之所以推荐第三种是因为 OpenSSL 1.1 系列在 CentOS 8 的 AppStream 仓库里有现成的openssl11和openssl11-libs包它们是独立命名空间不会覆盖系统自带的 OpenSSL 1.0.2风险相对可控。从腾讯云镜像下载 RPM 包速度也比默认仓库快很多运维场景下非常实用。2.2 借用 CentOS 8 仓库 RPM 包的可行性很多人听到“借用 CentOS 8 仓库的包”就紧张担心系统库被搞乱。其实openssl11这组包在设计时就考虑了共存需求安装后会把库文件放在独立目录/usr/lib64/openssl11/下面而不是直接覆盖/usr/lib64/libssl.so.10。也就是说它和系统自带的 OpenSSL 1.0.2 可以并存互不干扰。从依赖关系看openssl11-libs要求的基础库在 CentOS 7 上基本都能满足包括 glibc 2.17 等我在多台 CentOS 7.4 到 7.9 的机器上测试过没有遇到系统级依赖冲突。唯一需要注意的是安装 RPM 时要用rpm -ivh或yum localinstall来处理依赖而不是粗暴地直接覆盖系统 openssl 包。为什么不用源码编译OpenSSL 1.1.1 源码编译一遍快则几分钟慢则发呆半小时。期间还要装 gcc、perl、make 这些工具链本身又是一堆依赖。如果只是为了补一个动态库文件用现成 RPM 明显更高效。这也是我在这篇文章里主推 RPM 方案的原因。2.3 软链接的正确姿势与绝对不能碰的坑软链接是 Linux 里处理库文件缺失时最常被提到的手段但也是最容易被误用的。先说正确姿势安装好openssl11-libs后库文件在/usr/lib64/openssl11/目录下动态链接器并不会默认去那里找。为了让普通程序找到需要手动建立两个软链接把它们映射到/usr/lib64/标准目录。执行完软链接后还要运行ldconfig刷新缓存让动态链接器知道新增了 1.1 系列的库。再强调一个绝对不能做的操作不要试图把系统自带的libssl.so.10改成libssl.so.1.1的软链接。两个版本的 ABI 完全不同程序加载后拿到的是 OpenSSL 1.0 的代码但自己以为在用 1.1很可能一调用就段错误连个正常报错都不给你。这种“绕过问题”的做法生产环境里一旦遇到就是事故级故障。3. 实操用腾讯云镜像 5 分钟修复 libssl.so.1.1 缺失3.1 准备工作确认系统版本与架构正式操作前先确认两件事系统版本和 CPU 架构。不同版本的 CentOS 7 基础库略有差异架构不同安装包也不同。cat /etc/redhat-release uname -m正常情况下输出是CentOS Linux release 7.9.2009 (Core)和x86_64。如果你的服务器是 ARM 架构比如某些国产芯片服务器下面命令里的x86_64要换成aarch64腾讯云镜像同样有 ARM 目录。确认完这两项再继续走流程。3.2 从腾讯云镜像拉取 openssl11 相关 RPM 包腾讯云镜像的 CentOS 仓库有一个特点目录结构和官方同步更新频率也不错。访问https://mirrors.cloud.tencent.com/centos/8-stream/AppStream/x86_64/os/Packages/直接按照文件名前缀openssl11搜索就能找到相关 RPM 包。实际操作中我一般直接在服务器上用 wget 下载# 进入一个临时目录避免把 RPM 散落在根目录 mkdir -p /tmp/openssl11-fix cd /tmp/openssl11-fix # 下载 openssl11 和 openssl11-libs 两个包版本号以镜像实际为准 wget https://mirrors.cloud.tencent.com/centos/8-stream/AppStream/x86_64/os/Packages/openssl11-1.1.1k-5.el8.x86_64.rpm wget https://mirrors.cloud.tencent.com/centos/8-stream/AppStream/x86_64/os/Packages/openssl11-libs-1.1.1k-5.el8.x86_64.rpm如果服务器上 wget 因为证书问题拒绝下载有些精简系统没有安装 ca-certificates可以加--no-check-certificate参数临时绕过或者在一台能正常联网的机器上先下载再通过 scp 传到服务器。腾讯云镜像的好处是域名在国内下载速度快基本不会像默认源那样动不动超时。踩坑提示不同时期的镜像目录里版本号会变化比如 1.1.1k、1.1.1n、1.1.1o 都可能出现。我建议优先选版本号较新的但不必纠结到小版本1.1.1 系列内部的 ABI 基本一致能兼容绝大多数按 1.1 编译的程序。3.3 安装 RPM 包并建立软链接下载完成后用rpm -ivh安装这两个包。这里不推荐直接yum install因为 CentOS 7 的 yum 默认仓库里没有 openssl11直接 install 反而会去远程仓库搜索容易失败。正确做法是本地安装rpm -ivh openssl11-libs-*.rpm openssl11-*.rpm如果提示缺少其他依赖用yum localinstall再试一次它能把依赖一起装好yum localinstall -y openssl11-libs-*.rpm openssl11-*.rpm装完之后检查一下库文件路径rpm -ql openssl11-libs | grep libssl正常情况下输出里会出现/usr/lib64/openssl11/libssl.so.1.1和/usr/lib64/openssl11/libcrypto.so.1.1。由于这个目录不在系统默认搜索路径中需要手动创建软链接ln -s /usr/lib64/openssl11/libssl.so.1.1 /usr/lib64/libssl.so.1.1 ln -s /usr/lib64/openssl11/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1 ldconfigldconfig会重新扫描库目录并更新缓存让刚刚加入的 1.1 库对系统可见。这一步非常关键很多教程只做软链接却忘了刷新缓存导致程序依然找不到库白折腾半天。3.4 验证修复是否生效修复完不要急着跑业务程序先做两步验证。第一步用ldconfig -p检查缓存ldconfig -p | grep libssl.so.1.1有输出说明库已经被系统识别。第二步直接运行之前报错的程序如果是命令型工具可以在前面加ldd检查依赖是否全部解析ldd /path/to/your/program | grep not found如果没有not found输出说明依赖已经完整程序可以正常启动。我实测过好几个场景包括编译安装的 Nginx、基于 OpenSSL 1.1 的 Python 扩展模块这样处理完后都能立即运行不需要重启系统也不需要重启任何守护进程动态链接器会在程序下一次启动时自动加载新库。4. 我想顺便聊聊腾讯云镜像源的其他打开方式4.1 一键切换腾讯云 yum 源既然标题提到了“腾讯云镜像加速下载”就不说 RPM 这一个用法。CentOS 7 默认的官方 yum 源在高峰期经常很慢尤其在腾讯云、阿里云等国内厂商的服务器上直接把源切到腾讯云镜像能明显提升各种安装速度。一行命令就能完成wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.cloud.tencent.com/repo/centos7_base.repo执行完之后再清理并重建 yum 缓存yum clean all yum makecache这样做之后后续不管装什么包都会优先走腾讯云节点速度比默认源快很多。如果你的服务器还缺 EPEL 源对应的腾讯云仓库文件是https://mirrors.cloud.tencent.com/repo/epel-7.repo同样可以下载后放到/etc/yum.repos.d/目录下。4.2 用镜像源下载其他缺失库/软件包腾讯云镜像不只是 CentOS 仓库它还同步了 Ubuntu、Debian、openSUSE、Fedora 等多个发行版的软件仓库以及大量常见中间件的二进制包。当你再遇到类似“某个共享库缺失”的问题可以先把问题库名记下来再到镜像站搜对应的 RPM 或 deb 包下载速度比自己找官网快得多。比如之前我处理过一台机器缺失libpcre.so.1就是到腾讯云镜像的 CentOS 6 目录里找到 pcre 的 RPM下载安装后问题解决。核心思路是库文件缺失时先判断它属于哪个软件包再通过yum provides或镜像站目录检索最后用包管理器安装。这个方法比无脑编译源码通用得多。4.3 内网隔离环境下的离线修复思路有些服务器处于内网环境无法直接访问外网镜像站。这种情况下可以在外网机器上通过镜像站把所有相关 RPM 下载好再打包传到内网服务器。实际操作时建议把openssl11、openssl11-libs以及它们的所有依赖 RPM 都下载到一个目录然后在内网机器上用rpm -ivh *.rpm批量安装。如果你维护的内网服务器数量多推荐更正规的做法在内网自己搭一个 yum 仓库把常用 RPM 包放进去其他机器配置指向这个本地仓库之后所有机器都能快速装包。腾讯云镜像可以作为外网下载源来“喂饱”这个内网仓库一举两得。5. 常见问题与排查经验实录5.1 为什么装了 openssl11 后程序还是报找不到这是新手最容易踩的坑。安装完 openssl11-rpm 只是把库文件放到了/usr/lib64/openssl11/如果你没有做软链接也没有设置LD_LIBRARY_PATH系统根本不知道这个目录存在程序照样报错。建议检查顺序是是否执行了ln -s两步软链接是否执行了ldconfigldconfig -p | grep libssl是否有输出程序是用 root 启动的吗某些服务会调用chroot或修改库路径需要额外配置。5.2 软链接之后程序启动就段错误/崩溃出现这种情况大概率是程序实际依赖的是 OpenSSL 1.0 系列库却因为你的软链接或LD_LIBRARY_PATH设置被强行走到了 1.1 的库文件。OpenSSL 1.0 和 1.1 内部结构差异非常大程序拿到不兼容的代码执行一调用就崩是很正常的。遇到段错误第一件事是移除软链接恢复原状再确认程序到底需要哪个版本的库。ldd输出里会清清楚楚地列出依赖关系不要靠猜。5.3 在 Docker 容器里遇到同样问题怎么处理容器里的报错处理逻辑和宿主机基本一致但要注意容器是基于镜像构建的修复操作要写进 Dockerfile 或镜像层里而不是在容器运行后手动修改。那样容器一销毁修复就丢失了。建议在 Dockerfile 里RUN yum install -y wget \ wget -q https://mirrors.cloud.tencent.com/centos/8-stream/AppStream/x86_64/os/Packages/openssl11-libs-1.1.1k-5.el8.x86_64.rpm \ rpm -ivh openssl11-libs-*.rpm \ ln -s /usr/lib64/openssl11/libssl.so.1.1 /usr/lib64/libssl.so.1.1 \ ln -s /usr/lib64/openssl11/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1 \ ldconfig5.4 不想用 CentOS 8 的包源码编译怎么快速搞定如果因为某种原因你不能接受跨版本借用 RPM 包也可以走源码编译路线。OpenSSL 1.1.1 系列最后一个版本是 1.1.1w建议用这个版本wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --prefix/usr/local/openssl11 shared zlib make -j$(nproc) make install echo /usr/local/openssl11/lib /etc/ld.so.conf.d/openssl11.conf ldconfig不过说实话为了补一个动态库去编译整个 OpenSSL 源码成本偏高优先级我一般放在最后。5.5 常见问题速查表现象原因解决方法程序报 libssl.so.1.1 not found系统没有 OpenSSL 1.1 动态库安装 openssl11-libs 并做软链接安装后仍找不到库未执行软链接或未 ldconfig检查 /usr/lib64/libssl.so.1.1 是否存在重新 ldconfig软链接后程序段错误程序依赖的是 1.0 系列被错误引导到 1.1移除软链接恢复原状用 ldd 确认真实版本依赖yum 安装 openssl11 报错CentOS 7 默认仓库没有 openssl11 包改用 rpm -ivh 或 yum localinstall 本地安装Docker 容器修复后重启丢失修改写在容器层未写入镜像把修复步骤写入 Dockerfile最后再分享一个我自己的习惯碰到任何cannot open shared object file报错我从来不会急着去搜索文件名然后瞎装而是先跑两条命令ldd查依赖ldconfig -p查库缓存。搞清楚这个文件的真实身份、来自哪个软件包再决定怎么修。libssl.so.1.1这种问题绝大多数情况下用腾讯云镜像下载 RPM 包加软链接就能解决剩下的少数情况多半是二进制兼容性问题这时软链接解决不了应该回到源码目录重新编译。希望这篇内容能帮你把排查时间从下午茶赔进去的一个小时压缩到十分钟以内。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价