在 Linux 服务器上,sshd 可能因 OpenSSL 版本不匹配而启动失败,具体错误信息如下:
1 2 3 4 |
Mar 11 00:09:20 localhost sshd[51560]: OpenSSL version mismatch. Built against 30000070, you have 30200020 Mar 11 00:09:20 localhost systemd[1]: sshd.service: Main process exited, code=exited, status=255/EXCEPTION Mar 11 00:09:20 localhost systemd[1]: sshd.service: Failed with result 'exit-code'. Mar 11 00:09:20 localhost systemd[1]: Failed to start OpenSSH server daemon. |
本篇文章将详细分析该错误的原因,并提供多种解决方案。
从错误日志来看,sshd 需要 OpenSSL 3.0.7(版本号 30000070),但系统当前运行的是 OpenSSL 3.2.2(版本号 30200020)。可能的原因包括:
升级 OpenSSL 后未重启相关服务
系统中存在多个 OpenSSL 版本
动态链接库 (libssl.so) 仍然指向旧版本
如果系统近期升级了 OpenSSL,尝试重启 sshd:
1 |
systemctl restart sshd |
如果 sshd 仍然无法启动,继续执行以下步骤。
我是重启没起来,同时观察了/var/log/message日志,然后方法2
使用 ldd 命令检查 sshd 依赖的 OpenSSL 版本:
1 |
ldd /usr/sbin/sshd | grep ssl |
如果输出的 libssl.so 版本仍然是 3.0.7(旧版本),说明 sshd 没有链接到新版本的 OpenSSL。
我是什么也没有输出,然后ldconfig就没有执行,直接方法3
更新动态库缓存
1 |
ldconfig |
重新检查 ldd 输出,确保 sshd 现在链接到 OpenSSL 3.2.2。
如果 ldd 仍然指向旧的 OpenSSL 版本,请继续执行方法 3。
查看 /usr/lib64 目录下的 OpenSSL 版本:
1 2 |
ls -l /usr/lib64/libssl.so* ls -l /usr/lib64/libcrypto.so* |
如果存在多个 libssl.so 版本,例如:
1 2 3 |
/usr/lib64/libssl.so.3 -> libssl.so.3.0.7 /usr/lib64/libssl.so.3.0.7 /usr/lib64/libssl.so.3.2.2 |
说明 sshd 可能仍然链接到了 libssl.so.3.0.7。
???? 解决方法
手动将 libssl.so 链接到最新版本:
1 2 |
ln -sf /usr/lib64/libssl.so.3.2.2 /usr/lib64/libssl.so.3 ln -sf /usr/lib64/libcrypto.so.3.2.2 /usr/lib64/libcrypto.so.3 |
然后执行:
1 2 |
ldconfig systemctl restart sshd |
我都是指定的3.2.2,所以方法4走起
如果问题仍未解决,可能需要重新安装 openssh-server 以匹配新的 OpenSSL 版本:
1 2 |
yum reinstall openssh-server -y # CentOS/RHEL apt reinstall openssh-server -y # Debian/Ubuntu |
然后重启 sshd:
1 |
systemctl restart sshd |
解决了
通过上述方法,你应该可以成功解决 SSHD 启动失败的问题。