Ubuntu 升级OpenSSH10.2p1与OpenSSL3.5.4版本避坑实践
-
- 一、准备工作
- 二、编译安装OpenSSL
- 四、编译安装OpenSSH
- 常见问题与解决
当前服务器系统版本:
bash
root@csb134:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
一、准备工作
1.配置国内镜像源
ubuntu 20.04 LTS (focal) 配置如下
bash
deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
ubuntu 22.04 LTS (jammy) 配置如下
bash
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
2.安装telnet 服务
⚠注意:
Telnet 以明文传输数据(包括密码) ,易被窃听⚠️。仅建议在内网测试环境中使用,生产环境务必改用 SSH(端口 22)
在线安装方案
bash
sudo apt update # 更新软件包列表
sudo apt install telnetd xinetd -y # 安装 Telnet 服务端和守护程序
配置 Telnet 服务
写入以下内容(确保 disable = no)
bash
sudo vim /etc/xinetd.d/telnet
service telnet {
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
配置项详细解析
| 配置参数 | 说明与意义 | 必要性/用途 |
|---|---|---|
disable = no |
核心开关:设置为 no 表示启用该服务 (yes 表示禁用)。 |
✅ 若不设为 no,则 Telnet 服务无法响应连接请求,如同未安装。 |
flags = REUSE |
允许多个连接复用同一端口,提升端口资源使用率。 | ⚙️ TCP 协议优化选项,对于高并发场景有实际意义,默认配置即可。 |
socket_type = stream |
基于流式 TCP 协议(区别于 UDP 数据报),保障数据的可靠传输。 | ✅ Telnet 基于 TCP,必须设为 stream。 |
wait = no |
并行处理 多个客户端连接(若设为 yes 则每次只接受一个连接)。 |
✅ 避免因单用户占用导致其他用户无法登录,需设成 no 实现并发处理。 |
user = root |
Telnet 服务进程在系统内以 root 权限运行。 |
⚠️ 高安全风险!即使连接用户非 root,运行服务的进程权限为 root 可能导致权限漏洞。建议改为低权限用户(如 nobody),但需注意部分功能受限。 |
server = /usr/sbin/in.telnetd |
服务程序路径 :指定执行 Telnet 服务的守护程序(in.telnetd)。 |
✅ 关键路径设置,程序缺失需安装 telnetd。 |
log_on_failure += USERID |
登录失败时在系统日志中记录发起失败尝试的用户名(若可获取)。 | 🔍 增强安全审计能力,辅助排查攻击源。 |
xinetd统一管理系统服务(如 Telnet),配置必须声明协议行为(如socket_type=stream)来正确转发端口流量
创建opi账号,此账号用于通过Telnet登录到服务器
bash
useradd -m -s /bin/bash opi
echo 'opi:!QAZ@WSX' | chpasswd
给与opi账号权限
bash
echo "opi ALL=(ALL:ALL) ALL" | sudo tee /etc/sudoers.d/opi-perms
sudo chmod 0440 /etc/sudoers.d/opi-perms # 权限必须为 440
启动服务
bash
/etc/init.d/openbsd-inetd restart
开放防火墙端口(如果firewalld正在运行)
bash
# 允许TCP流量通过23端口
sudo ufw allow 23/tcp
# 重新加载配置使规则生效
sudo ufw reload
#查看telnet服务的默认端口是否启动;
netstat -anpt|grep 23
登陆后切换到root账号
bash
opi@csb136:~$ sudo -i
[sudo] password for opi:
root@csb136:~#
离线安装方案
下载离线包
从 https://packages.ubuntu.com/ 或 https://mirrors.tuna.tsinghua.edu.cn/ubuntu/pool/main/ 下载以下包:
(需根据系统架构选择
amd64或arm64版本)
bash
telnetd_0.17+2.5-5ubuntu1_all.deb
inetutils-telnetd_1.9.4-11ubuntu0.2_amd64.deb
xinetd_2.3.15.3-1_amd64.deb
安装依赖包
将下载的 .deb 文件上传到目标机器,按顺序安装:
bash
sudo dpkg -i telnetd_*.deb
sudo dpkg -i inetutils-telnetd_*.deb
sudo dpkg -i xinetd_*.deb
若提示依赖缺失,用 sudo apt --fix-broken install 修复
配置并启动服务
同在线安装的步骤
连接测试
本地测试:
bash
telnet localhost 23 # 输入用户名/密码尝试登录
远程测试:
bash
telnet <服务器IP> 23
#若显示 Connected to... 即成功
补充:Telnet认证方式
本地系统账号登录
Linux/Unix 系统(如 Ubuntu)允许通过本地系统账号登录,例如 root 或普通用户。Telnet 将用户名/密码提交至系统认证模块(如 PAM),验证是否存在该账户。
专用账户登录
网络设备,如华为交换机/路由器 采取AAA 模式 ,必须提前创建专用于 Telnet 的账户,通过以下命令配置
bash
aaa
local-user admin password cipher ***** # 设置密码
local-user admin service-type telnet # 指定服务类型
local-user admin privilege level 15 # 设置权限
企业交换机/路由器通常不开放系统账户(如 root),需管理员手动创建独立账户并通过 VTY 线路绑定认证方式(如 authentication-mode aaa)
密码模式(无需用户名)
authentication-mode password,登录时只需输入预设密码(无需用户名)
所有用户共享同一密码,权限单一,适合低风险环境临时使用。
3.编译环境准备
bash
#1.卸载原openssh
sudo apt-get remove openssh-server openssh-client openssl -y
#2.更新系统
sudo apt update && sudo apt upgrade -y
# 3.安装编译依赖
sudo apt install -y build-essential libedit-dev zlib1g-dev libssl-dev \
libpam0g-dev libselinux1-dev libcap-dev \
wget tar gcc make autoconf automake libtool \
pkg-config checkinstall
二、编译安装OpenSSL
注意:Ubuntu 20.04 依赖 OpenSSL 1.1.1,升级到 3.5.4 后需确保兼容性(大多数软件支持 OpenSSL 3)。
下载源码
bash
cd /usr/local/src
sudo wget https://github.com/openssl/openssl/releases/download/openssl-3.5.4/openssl-3.5.4.tar.gz
# 内网环境
#sudo wget http://10.1.0.67/softs/openssl-3.5.4.tar.gz
sudo tar -xzf openssl-3.5.4.tar.gz
cd openssl-3.5.4
备份原有库
bash
sudo mv /usr/bin/openssl /usr/bin/openssl-`date +%Y-%m-%d-%H`.bak
sudo mv /usr/lib/x86_64-linux-gnu/libssl.so.1.1 /usr/lib/x86_64-linux-gnu/libssl.so.1.1-`date +%Y-%m-%d-%H`.bak
sudo mv /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1-`date +%Y-%m-%d-%H`.bak
编译安装
定义openssl安装到 /usr/local/ssl 避免覆盖系统
bash
sudo ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
**********************************************************************
*** ***
*** OpenSSL has been successfully configured ***
*** ***
*** If you encounter a problem while building, please open an ***
*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
*** and include the output from the following command: ***
*** ***
*** perl configdata.pm --dump ***
*** ***
*** (If you are new to OpenSSL, you might want to consult the ***
*** 'Troubleshooting' section in the INSTALL.md file first) ***
*** ***
**********************************************************************
sudo make -j$(nproc)
# 强烈建议运行测试
sudo make test
sudo make install
配置动态链接
怎么做的原因是让系统优先使用新版,且不覆盖原本的文件
bash
# 创建符号链接
sudo ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
#可选
#sudo ln -sf /usr/local/ssl/lib64/libssl.so.3 /usr/lib64/libssl.so.3
#sudo ln -sf /usr/local/ssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3
# 更新 ld.so 缓存
echo "/usr/local/ssl/lib64" | sudo tee /etc/ld.so.conf.d/openssl-3.5.4.conf
sudo ldconfig
验证 OpenSSL版本
bash
openssl version
# 输出:OpenSSL 3.5.4 xx xxx xxxx 则证明安装成功
四、编译安装OpenSSH
下载源码
bash
cd /usr/local/src
sudo wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz
## 内网环境
## sudo wget http://10.1.0.67/softs/openssh-10.2p1.tar.gz
sudo tar -xzf openssh-10.2p1.tar.gz
cd openssh-10.2p1
停止OpenSSH服务
注意:以下操作使用telnet 进行,否则会中断与服务器的连接
bash
systemctl stop sshd
pkill -9 sshd
备份原配置
bash
mkdir -p /root/ssh_backup_$(date +%Y%m%d)
rsync -av /etc/ssh /etc/pam.d /usr/sbin/sshd /usr/bin/ssh /root/ssh_backup_$(date +%Y%m%d)/
配置编译
指定 OpenSSL 路径
bash
sudo ./configure \
--prefix=/usr/local/openssh \
--sysconfdir=/etc/ssh \
--with-ssl-dir=/usr/local/ssl \
--with-pam \
--with-zlib \
--with-libedit \
--without-hardening \
--with-privsep-path=/var/lib/sshd
--with-ssl-dir=/usr/local/ssl确保使用我们编译的 OpenSSL 3.5.4
应出现以下内容
bash
PAM is enabled. You may need to install a PAM control file
for sshd, otherwise password authentication may fail.
Example PAM control files can be found in the contrib/
subdirectory
清理旧版本目录
bash
rm -rf /etc/ssh/
rm -rf /usr/bin/sshd
rm -rf /usb/sbin/sshd
编译并安装
bash
sudo make -j$(nproc)
sudo make install
注意:make install 会覆盖:
- /usr/sbin/sshd
- /usr/bin/ssh, scp, sftp 等
- /etc/ssh/sshd_config(会备份为 sshd_config.install)
bash
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
cp /usr/local/openssh/bin/ssh /usr/bin/ssh
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
过程
bash
root@csb136:/usr/local/src/openssh-10.2p1# sudo make install
(cd openbsd-compat && make)
make[1]: Entering directory '/usr/local/src/openssh-10.2p1/openbsd-compat'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/usr/local/src/openssh-10.2p1/openbsd-compat'
/usr/bin/mkdir -p /usr/local/openssh/bin
/usr/bin/mkdir -p /usr/local/openssh/sbin
/usr/bin/mkdir -p /usr/local/openssh/share/man/man1
/usr/bin/mkdir -p /usr/local/openssh/share/man/man5
/usr/bin/mkdir -p /usr/local/openssh/share/man/man8
/usr/bin/mkdir -p /usr/local/openssh/libexec
/usr/bin/mkdir -p -m 0755 /var/lib/sshd
/usr/bin/install -c -m 0755 -s ssh /usr/local/openssh/bin/ssh
/usr/bin/install -c -m 0755 -s scp /usr/local/openssh/bin/scp
/usr/bin/install -c -m 0755 -s ssh-add /usr/local/openssh/bin/ssh-add
/usr/bin/install -c -m 0755 -s ssh-agent /usr/local/openssh/bin/ssh-agent
/usr/bin/install -c -m 0755 -s ssh-keygen /usr/local/openssh/bin/ssh-keygen
/usr/bin/install -c -m 0755 -s ssh-keyscan /usr/local/openssh/bin/ssh-keyscan
/usr/bin/install -c -m 0755 -s sshd /usr/local/openssh/sbin/sshd
/usr/bin/install -c -m 0755 -s sshd-session /usr/local/openssh/libexec/sshd-session
/usr/bin/install -c -m 0755 -s sshd-auth /usr/local/openssh/libexec/sshd-auth
/usr/bin/install -c -m 4711 -s ssh-keysign /usr/local/openssh/libexec/ssh-keysign
/usr/bin/install -c -m 0755 -s ssh-pkcs11-helper /usr/local/openssh/libexec/ssh-pkcs11-helper
/usr/bin/install -c -m 0755 -s ssh-sk-helper /usr/local/openssh/libexec/ssh-sk-helper
/usr/bin/install -c -m 0755 -s sftp /usr/local/openssh/bin/sftp
/usr/bin/install -c -m 0755 -s sftp-server /usr/local/openssh/libexec/sftp-server
/usr/bin/install -c -m 644 ssh.1.out /usr/local/openssh/share/man/man1/ssh.1
/usr/bin/install -c -m 644 scp.1.out /usr/local/openssh/share/man/man1/scp.1
/usr/bin/install -c -m 644 ssh-add.1.out /usr/local/openssh/share/man/man1/ssh-add.1
/usr/bin/install -c -m 644 ssh-agent.1.out /usr/local/openssh/share/man/man1/ssh-agent.1
/usr/bin/install -c -m 644 ssh-keygen.1.out /usr/local/openssh/share/man/man1/ssh-keygen.1
/usr/bin/install -c -m 644 ssh-keyscan.1.out /usr/local/openssh/share/man/man1/ssh-keyscan.1
/usr/bin/install -c -m 644 moduli.5.out /usr/local/openssh/share/man/man5/moduli.5
/usr/bin/install -c -m 644 sshd_config.5.out /usr/local/openssh/share/man/man5/sshd_config.5
/usr/bin/install -c -m 644 ssh_config.5.out /usr/local/openssh/share/man/man5/ssh_config.5
/usr/bin/install -c -m 644 sshd.8.out /usr/local/openssh/share/man/man8/sshd.8
/usr/bin/install -c -m 644 sftp.1.out /usr/local/openssh/share/man/man1/sftp.1
/usr/bin/install -c -m 644 sftp-server.8.out /usr/local/openssh/share/man/man8/sftp-server.8
/usr/bin/install -c -m 644 ssh-keysign.8.out /usr/local/openssh/share/man/man8/ssh-keysign.8
/usr/bin/install -c -m 644 ssh-pkcs11-helper.8.out /usr/local/openssh/share/man/man8/ssh-pkcs11-helper.8
/usr/bin/install -c -m 644 ssh-sk-helper.8.out /usr/local/openssh/share/man/man8/ssh-sk-helper.8
/usr/bin/mkdir -p /etc/ssh
/etc/ssh/ssh_config already exists, install will not overwrite
/etc/ssh/sshd_config already exists, install will not overwrite
/etc/ssh/moduli already exists, install will not overwrite
/usr/local/openssh/sbin/sshd -t -f /etc/ssh/sshd_config
新版本目录
bash
root@csb136:/usr/local/src/openssh-10.2p1# ls /etc/ssh/
total 616K
drwxr-xr-x 2 root root 4.0K Oct 30 14:47 .
drwxr-xr-x 126 root root 12K Oct 30 14:47 ..
-rw-r--r-- 1 root root 568K Oct 30 14:47 moduli
-rw-r--r-- 1 root root 1.5K Oct 30 14:47 ssh_config
-rw------- 1 root root 505 Oct 30 14:47 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 173 Oct 30 14:47 ssh_host_ecdsa_key.pub
-rw------- 1 root root 399 Oct 30 14:47 ssh_host_ed25519_key
-rw-r--r-- 1 root root 93 Oct 30 14:47 ssh_host_ed25519_key.pub
-rw------- 1 root root 2.6K Oct 30 14:47 ssh_host_rsa_key
-rw-r--r-- 1 root root 565 Oct 30 14:47 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 3.3K Oct 30 14:47 sshd_config
备份的旧版本目录
bash
root@csb136:/usr/local/src/openssh-10.2p1# ls /root/ssh_backup_20251030/ssh
total 556K
drwxr-xr-x 3 root root 4.0K Sep 19 10:47 .
drwxr-xr-x 4 root root 4.0K Oct 30 14:31 ..
-rw-r--r-- 1 root root 494K Sep 23 2022 moduli
-rw-r--r-- 1 root root 1.5K Sep 23 2022 ssh_config
drwxr-xr-x 2 root root 4.0K Apr 11 2025 ssh_config.d
-rw------- 1 root root 1.4K Sep 23 2022 ssh_host_dsa_key
-rw-r--r-- 1 root root 601 Sep 23 2022 ssh_host_dsa_key.pub
-rw------- 1 root root 505 Sep 23 2022 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 173 Sep 23 2022 ssh_host_ecdsa_key.pub
-rw------- 1 root root 399 Sep 23 2022 ssh_host_ed25519_key
-rw-r--r-- 1 root root 93 Sep 23 2022 ssh_host_ed25519_key.pub
-rw------- 1 root root 2.6K Sep 23 2022 ssh_host_rsa_key
-rw-r--r-- 1 root root 565 Sep 23 2022 ssh_host_rsa_key.pub
-rw------- 1 root root 3.3K May 7 10:22 sshd_config
-rw-r--r-- 1 root root 3.2K Oct 20 2023 sshd_config.bak.2023-10-20
-rw-r--r-- 1 root root 3.2K Jan 25 2024 sshd_config.bak.20250507-102203
还原关键文件
我们已经将OpenSSH 10.2p1 采用"隔离安装"方式(避免覆盖系统自带的 OpenSSH),成功编译安装到了自定义前缀/usr/local/openssh/目录,但这样会导致二进制、man 页、配置文件路径都不在标准位置。
要使用新编译的 OpenSSH,就需要把关键文件"还原"到默认路径,否则 ssh, sshd, systemctl restart sshd 等命令还是走旧版本。
| 新安装路径 | 标准系统路径 | 操作建议 |
|---|---|---|
/usr/local/openssh/bin/ssh |
/usr/bin/ssh |
备份旧的 → 链接或复制 |
/usr/local/openssh/bin/scp |
/usr/bin/scp |
同上 |
/usr/local/openssh/bin/ssh-keygen |
/usr/bin/ssh-keygen |
同上 |
/usr/local/openssh/bin/sftp |
/usr/bin/sftp |
同上 |
/usr/local/openssh/sbin/sshd |
/usr/sbin/sshd |
重点! |
/usr/local/openssh/libexec/* |
/usr/libexec/ 或 /usr/lib/openssh/ |
视系统而定 |
/usr/local/openssh/share/man/ |
/usr/share/man/ |
可选,man 页 |
bash
mkdir -p /root/ssh_backup_$(date +%Y%m%d)
rsync -av /etc/ssh /etc/pam.d /usr/sbin/sshd /usr/bin/ssh /root/ssh_backup_$(date +%Y%m%d)/
# 1. 备份系统原有文件(非常重要!)
sudo mv /usr/bin/ssh /usr/bin/ssh.$(date +%Y%m%d)
sudo mv /usr/bin/scp /usr/bin/scp.$(date +%Y%m%d)
sudo mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.$(date +%Y%m%d)
sudo mv /usr/bin/sftp /usr/bin/sftp.$(date +%Y%m%d)
sudo mv /usr/sbin/sshd /usr/sbin/sshd.$(date +%Y%m%d) # 重点
# 2. 创建符号链接(推荐,节省空间,便于切换)
sudo ln -sf /usr/local/openssh/bin/ssh /usr/bin/ssh
sudo ln -sf /usr/local/openssh/bin/scp /usr/bin/scp
sudo ln -sf /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
sudo ln -sf /usr/local/openssh/bin/sftp /usr/bin/sftp
sudo ln -sf /usr/local/openssh/sbin/sshd /usr/sbin/sshd
# 3. 处理 libexec 目录(不同系统路径不同)
# CentOS/RHEL 通常是 /usr/libexec/
# Ubuntu/Debian 通常是 /usr/lib/openssh/
sudo mkdir -p /usr/libexec/openssh
sudo ln -sf /usr/local/openssh/libexec/* /usr/libexec/openssh/ 2>/dev/null || true
# Ubuntu/Debian 额外处理
sudo mkdir -p /usr/lib/openssh
sudo ln -sf /usr/local/openssh/libexec/* /usr/lib/openssh/ 2>/dev/null || true
恢复或编辑配置
bash
sudo cp /root/ssh_backup_20251030/ssh/sshd_config /etc/ssh/sshd_config
bash
# 测试配置文件语法(用新版 sshd)
sudo /usr/local/openssh/sbin/sshd -t -f /etc/ssh/sshd_config
确保权限正确
bash
sudo chown root:root /etc/ssh/sshd_config
sudo chmod 600 /etc/ssh/sshd_config
重启 SSH 服务
bash
sudo systemctl restart ssh
sudo systemctl status ssh
验证升级结果
bash
# 1. 查看 SSH 版本
ssh -V
OpenSSH_10.2p1, OpenSSL 3.5.4 30 Sep 2025
# 2. 查看动态链接库
ldd /usr/sbin/sshd | grep -E "ssl|crypto"
# 应指向 /usr/local/ssl/lib/libcrypto.so.3
libcrypto.so.3 => /usr/local/ssl/lib64/libcrypto.so.3 (0x00007f315c2cc000)
回滚方法
如果服务启动时出现问题,通过以下方法进行回滚恢复原版
bash
# 恢复系统原版
sudo rm /usr/bin/ssh /usr/bin/scp /usr/bin/ssh-keygen /usr/bin/sftp /usr/sbin/sshd
sudo mv /usr/bin/ssh.$(date +%Y%m%d) /usr/bin/ssh
sudo mv /usr/bin/scp.$(date +%Y%m%d) /usr/bin/scp
sudo mv /usr/bin/ssh-keygen.$(date +%Y%m%d) /usr/bin/ssh-keygen
sudo mv /usr/bin/sftp.$(date +%Y%m%d) /usr/bin/sftp
sudo mv /usr/sbin/sshd.$(date +%Y%m%d) /usr/sbin/sshd
sudo systemctl restart sshd
常见问题与解决
bash
root@csb134:/usr/local/ssl# sudo ldconfig -v | grep ssl
/sbin/ldconfig.real: 无法对 /usr/local/lib/x86_64-linux-gnu 进行 stat 操作: 没有那个文件或目录
/sbin/ldconfig.real: 多次给出路径"/usr/lib/x86_64-linux-gnu"
/sbin/ldconfig.real: 多次给出路径"/lib/x86_64-linux-gnu"
/sbin/ldconfig.real: 多次给出路径"/usr/lib/x86_64-linux-gnu"
/sbin/ldconfig.real: 多次给出路径"/usr/lib"
/usr/local/ssl/lib64:
libssl.so.3 -> libssl.so.3
libevent_openssl-2.1.so.7 -> libevent_openssl.so
/sbin/ldconfig.real: /lib/x86_64-linux-gnu/ld-2.31.so is the dynamic linker, ignoring
libssl.so.1.1 -> libssl.so.1.1-2025-10-30-11:21.bak
libssl3.so -> libssl3.so
/sbin/ldconfig.real: 无法对 /lib/libpng.so 进行 stat 操作: 没有那个文件或目录
libxmlsec1-openssl.so.1 -> libxmlsec1-openssl.so.1.2.28
问题1:
libssl.so.3: cannot open shared object file: No such file or directory
bash
root@csb134:/etc/ld.so.conf.d# openssl version
openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
确认库文件是否存在
首先确认库文件libssl.so.3是否存在
bash
find /usr/local/ssl/ -name "libssl.so.3*"
/usr/local/ssl/lib64/libssl.so.3
-
若有输出路径 :(例如
/usr/local/ssl/lib64/libssl.so.3),继续下一步。 -
若无输出 :重新检查 OpenSSL 安装过程,确保
make install成功执行。若安装路径错误,需修正路径后重新编译安装
检查动态库路径配置
确保配置文件中路径与实际库路径一致
bash
# 确认配置文件内容
cat /etc/ld.so.conf.d/openssl-3.5.4.conf
# 输出应为:/usr/local/ssl/lib 或 /usr/local/ssl/lib64
# 更新链接库缓存
sudo ldconfig -v | grep ssl # 检查是否包含你的路径
验证修复结果
bash
# 检查库是否可加载
ldd /usr/bin/openssl | grep libssl
# 检查 OpenSSL 版本
openssl version
#正常应输出:
OpenSSL 3.5.4 11 Oct 2024 (Library: OpenSSL 3.5.4 11 Oct 2024)
问题2:
/sbin/ldconfig.real: 无法对 /lib/libpng.so 进行 stat 操作: 没有那个文件或目录
问题原因
某个软件包(比如 libpng-dev、imagemagick、php 等)曾创建软链接 /lib/libpng.so 某个真实文件,但真实文件被删除或升级后,软链接变成"死链"。
解决方法
bash
# 1. 找出所有指向不存在文件的 libpng.so 软链接
sudo find /lib /usr/lib -type l -name "libpng.so*" ! -exec test -e {} \; -ls
# 2. 删除它们
sudo find /lib /usr/lib -type l -name "libpng.so*" ! -exec test -e {} \; -delete
# 3. 如果确实需要 libpng,重新安装系统包(可选)
sudo apt install --reinstall libpng16-16 -y
问题3:
无法对 /usr/local/lib/x86_64-linux-gnu 进行 stat 操作
排查所有 ld.so 配置文件
ls /etc/ld.so.conf.d/
-rw-r--r-- 1 root root 38 9月 7 2019 fakeroot-x86_64-linux-gnu.conf
-rw-r--r-- 1 root root 21 10月 30 11:57 openssl-3.5.4.conf
-rw-r--r-- 1 root root 100 4月 15 2020 x86_64-linux-gnu.conf
查看哪些.conf文件都包含 /usr/lib/x86_64-linux-gnu 路径
解决方法
通过排查发现x86_64-linux-gnu.conf文件,第1行路径不存在导致 stat 错误
Ubuntu 20.04 默认没有 /usr/local/lib/x86_64-linux-gnu 目录,这个路径是 multiarch 支持 的标准路径,但 只有在手动创建或安装了对应架构库时才存在
它被写进系统配置文件 ldconfig 每次都尝试扫描发生报错
注释或删除不存在的路径
bash
vim /etc/ld.so.conf.d/x86_64-linux-gnu.conf
# Multiarch support
# /usr/local/lib/x86_64-linux-gnu ← 注释掉这行
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
保存退出。
问题4:
清理旧OpenSSL 的路径,导致 ldconfig 扫描到一个指向备份文件的软链接。libssl.so.1.1 -> libssl.so.1.1-2025-10-30-11:21.bak
查找所有指向 .bak 的软链接
bash
sudo find /usr/lib /lib /usr/local -name "libssl.so.1.1*" -type l
bash
root@csb134:/etc/ld.so.conf.d# ls /usr/lib/x86_64-linux-gnu/libssl.
libssl.a libssl.so.1.1-2025-10-30-11:21.bak
libssl.so.1.1 libssl.so.3
删除软连接
bash
sudo rm -f /usr/lib/x86_64-linux-gnu/libssl.so.1.1
清理缓存
bash
清理缓存重建
sudo rm -rf /var/cache/ldconfig/*
sudo ldconfig
验证
bash
sudo ldconfig -v 2>/dev/null | grep libssl