CentOS 7 离线升级 OpenSSH
在 CentOS 7 系统中进行 OpenSSH 9.9b2 版本的离线安装,需先在能联网的环境下下载所需的依赖包和 OpenSSH 源码包,再将这些文件传输到离线的 CentOS 7 系统中进行安装。
一、所需依赖
- zlib-devel-1.2.7-21.el7_9.x86_64:http://www.zlib.net
- OpenSSL-3.3.3:https://www.openssl.org
- OpenSSH-9.9p2:https://www.openssh.com
- pam-devel-1.1.8-23.el7.x86_64:http://rpmfind.net
二、联网环境下的准备工作
(一)安装编译依赖工具
在联网的 CentOS 7 系统上,使用以下命令安装编译所需的基本工具,并检查相关工具的版本信息:
bash
yum install -y wget gcc make pam-devel zlib-devel openssl-devel
由于 Openssl 版本过低,需重新安装 3.3.3 版本,可从Downloads | OpenSSL Library下载。
(二)备份或重命名旧版本
在继续之前,先备份或重命名旧的 OpenSSL 安装目录,以便在新版本安装出错时恢复:
bash
sudo mv /usr/local/openssl /usr/local/openssl_backup
(三)下载并解压新版本
- 卸载现有的 OpenSSL:
bash
sudo yum remove openssl openssl-devel
- 清理残留文件,确保所有相关的配置文件和缓存被删除:
bash
sudo rm -rf /etc/ssl
sudo rm -rf /usr/local/ssl
- 从源代码编译安装 OpenSSL:
- 可以从 OpenSSL 官方网站下载最新的源代码包,然后拖进 centos7 中,再进行解压和安装。
- 也可使用 wget 命令直接下载:
bash
wget https://www.openssl.org/source/openssl-3.3.3.tar.gz
- 解压下载的文件:
bash
tar -xzvf openssl-3.3.3.tar.gz
- 配置和编译:
bash
cd openssl-3.3.3
./config
make && make install
- 更新库缓存:
bash
sudo ldconfig
(四)验证安装
通过以下命令验证 OpenSSL 是否成功安装:
bash
openssl version
若显示了 OpenSSL 的版本信息,则说明安装成功。还可以使用以下命令进一步查看相关信息:
- 查看 openssl 版本信息。
- 查看 openssl 的可执行文件的位置:
bash
which openssl
- 使用 ldd 检查:
bash
ldd /usr/local/openssl/bin/openssl
(五)解决安装问题
- 关联库找不到问题:如果遇到关联库找不到问题,可检查库的引用路径是否正确:
bash
ldd $(which openssl)
若执行该命令后出现 "not found",代表对应的库找不到。此时,可在配置文件~/.bashrc
或~/.zshrc
中,把库的地址指向解压后的源码路径/usr/local/src/openssl-3.3.3
,即添加以下内容:
bash
export LD_LIBRARY_PATH="/usr/local/src/openssl-3.3.3:$LD_LIBRARY_PATH"
然后使用以下命令使环境变量更改生效:
bash
source ~/.bashrc
- 找不到可执行文件路径问题 :如果 openssl 安装时提示找不到可执行文件路径 "bash: /usr/bin/openssl: No such file or directory",可手动在配置文件
~/.bashrc
或~/.zshrc
中把可执行文件的地址指向which openssl
命令查询出来的路径/usr/local/bin/openssl
,即添加以下内容:
bash
export PATH=$PATH:/usr/local/bin
使用以下命令使环境变量更改生效:
bash
source ~/.bashrc
三、离线安装
(一)清除之前安装的 sshd 文件
使用以下命令清除之前安装的 sshd 相关文件:
bash
rpm -e --nodeps openssh
rpm -e --nodeps openssh-server
rpm -e --nodeps openssh-clients
cd ..
ls
(二)下载并解压 OpenSSH 源码
- 从 OpenSSH 官方网站或其镜像站点下载 OpenSSH 9.9.1 的源码包:
bash
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p1.tar.gz
- 解压源码包:
bash
tar -xzf openssh-9.9p1.tar.gz
cd openssh-9.9p1
(三)配置编译环境
使用以下命令配置编译环境:
bash
./configure --prefix=/usr/local/openssh9.9 --sysconfdir=/etc/ssh --with-md5-passwords --with-privsep-path=/var/lib/sshd
常用配置选项解释:
--prefix=/usr/local/openssh9.9
:指定安装路径。--sysconfdir=/etc/ssh
:指定配置文件目录。--with-md5-passwords
:启用 MD5 密码支持。--with-privsep-path=/var/lib/sshd
:指定特权分离路径。
(四)编译并安装源码
bash
make && make install
(五)配置 SSH 服务
- 创建必要的目录和文件:
bash
sudo mkdir -p /var/lib/sshd
sudo touch /var/log/secure
sudo chown root:root /var/log/secure
sudo chmod 0600 /var/log/secure
- 编辑 SSH 配置文件
vi /etc/ssh/sshd_config
,确保包含以下基本配置:
bash
Port 22
Protocol 2
PermitRootLogin yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/local/openssh9.9/libexec/sftp-server
注意:Subsystem
需设置为安装的 openssh9.9 的路径;PermitRootLogin
不建议设置为yes
,但设置为yes
更方便远程操作。
(六)启动 SSH 服务并设置开机自启
bash
sudo /usr/local/openssh9.9/sbin/sshd -f /etc/ssh/sshd_config
若出现 "error while loading shared libraries: libcrypto.so.3: cannot open shared object file: No such file or directory",则直接修改动态链接库配置文件vi /etc/ld.so.conf
,将 openssl 安装包中的链接路径放入(也可使用find /usr -name "libcrypto.so*"
查看与该库相关的文件所在的文件夹,放入该文件夹路径),保存文件后执行ldconfig
使动态链接库实时生效。
(七)检查 sshd 服务状态
使用以下命令检查 sshd 服务的状态:
bash
sudo systemctl status sshd
若没有 "fail",则代表正常。否则,按以下几点排查问题:
- 若出现 "Failed to enable unit: Unit file sshd.service does not exist",代表
sshd.service
未能创建成功,需手动创建sshd.service
服务,编辑vi /etc/systemd/system/sshd.service
,填充内容如下
bash
[Unit]
Description=OpenSSH server daemon
After=network.target
[Service]
ExecStart=/usr/local/openssh9.9/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
其中,ExecStart
为 sshd 可执行文件的位置。
- 创建或修改
sshd.service
文件后,重新加载系统守护进程并启动 SSH 服务:
bash
sudo systemctl daemon-reload
sudo systemctl start sshd
sudo systemctl enable sshd
sudo systemctl restart sshd
- 若仍然启动不了,可能是端口占用,使用以下命令查看 22 端口的 PID:
bash
sudo netstat -tulnp | grep :22
再使用kill -9 PID
杀死端口,然后使用以下命令重启 sshd 服务:
bash
sudo systemctl restart sshd
- 再次检查 SSH 服务状态:
bash
sudo systemctl status sshd
若没有 "fail",则代表正常。