整个过程不需要卸载原有的OpenSSL和OpenSSH的rpm包,升级时要通过控制台操作而不是通过SSH本身进行操作(防止升级期间SSH会话断开导致中断)。
升级前准备
登陆CentOS7系统,执行“yum update openssh
”,先将OpenSSH升级到YUM仓库支持的最新版本,如果中途提示[y/N],输入y并回车来确认继续。
执行“openssl version
”,查看当前的OpenSSL版本并记录,例如下图的版本是OpenSSL 1.0.2:

执行“ssh -V
”,查看当前的OpenSSH版本并记录,例如下图的版本是OpenSSH 7.4p1:

可以看到这两个软件的版本都是2017年的,不是最新版本。
安装依赖包
升级过程需要几个组件包,分别执行以下命令(每个yum install开头的是一条命令)来安装:
yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel
yum install -y pam* zlib*
yum install -y perl-IPC-Cmd
安装OpenSSL
备份文件
1)、执行命令:ll /usr/bin/openssl

如果有显示(存在)此文件,那么执行如下命令将其重命名进行备份:
mv /usr/bin/openssl /usr/bin/openssl_bak
2)、执行命令:ll /usr/include/openssl/

这是一个目录,如果有显示(存在)此目录,那么执行如下命令将其重命名进行备份:
mv /usr/include/openssl/ /usr/include/openssl_bak
执行升级
创建临时目录,用于上传安装包:
mkdir /tmp/ssh-ssl
cd /tmp/ssh-ssl/
将OpenSSL软件包上传到系统上(本次举例使用的是WinSCP工具上传):


执行以下命令来解压缩(openssl-3.0.5.tar.gz是软件包名,会根据下载的版本而变化):
tar xzvf openssl-3.0.5.tar.gz
进入解压后的软件目录:
cd openssl-3.0.5/

执行如下命令来编译安装新版本的openssl(配置、编译、安装3个命令一起执行,&&符号表示前面的命令执行成功才会执行后面的。):
./config shared --prefix=/usr/local/ssl && make && make install
等待程序自动编译、安装完成(可能需要等待数分钟):

等待执行完毕后,输入如下命令查看一下最后的make install是否有报错,0表示正常:
echo $?

需要创建几个软链接,逐个执行以下命令:
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl/ /usr/include/openssl
ln -s /usr/local/ssl/lib64/libssl.so.3 /usr/lib64/libssl.so.3
ln -s /usr/local/ssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3
逐个执行以下命令,查看这些软链接是否已经创建完成:
ll /usr/bin/openssl
ll /usr/include/openssl
ll /usr/lib64/libssl.so.3
ll /usr/lib64/libcrypto.so.3

依次执行以下命令,加载新配置:
echo "/usr/local/ssl/lib64" >> /etc/ld.so.conf
/sbin/ldconfig
查看一下版本信息,确认没问题:

安装OpenSSH
备份文件
执行以下命令,创建临时目录并将ssh的部分文件备份一下以备后面使用:
mkdir -p /tmp/ssh-ssl/ssh-backup
cp -r /etc/ssh/sshd_config /tmp/ssh-ssl/ssh-backup/
cp /etc/pam.d/sshd /tmp/ssh-ssl/ssh-backup/
执行升级
将OpenSSH软件包上传到系统上:


执行以下命令来解压缩(openssh-9.0p1.tar.gz是软件包名,会随版本而变化):
tar xzvf openssh-9.0p1.tar.gz
执行以下命令删除原版OpenSSH的配置文件和目录:
rm -rf /etc/ssh/*
进入解压后的软件目录:
cd openssh-9.0p1/

执行如下命令来配置、编译、安装,注意命令是完整的一行,以一行输入并一次性执行:
./configure --prefix=/usr/ --sysconfdir=/etc/ssh --with-openssl-includes=/usr/local/ssl/include --with-ssl-dir=/usr/local/ssl --with-zlib --with-md5-passwords --with-pam && make && make install
等待程序自动编译、安装完成(可能需要等待数分钟):

等待执行完毕后,输入如下命令查看一下最后的make install是否有报错,0表示正常:
echo $?

执行此命令编辑修改配置文件:vi /etc/ssh/sshd_config
找到以下内容并按照这样修改(如果配置文件里默认没有这一行,则手动添加;如果对应内容被默认注释了,则需要去掉“#”井号来取消对应行的注释,或者直接另起一行输入对应配置内容。):
PermitRootLogin yes

UseDNS no

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

PasswordAuthentication yes

UsePAM yes

X11Forwarding yes

执行此命令编辑认证配置文件:vi /etc/pam.d/sshd
检查文件里是否有类似如下内容:

如果发现这个文件是空的,没有内容,则需要手动添加一下,内容是:
#%PAM-1.0<br>auth required pam_sepermit.so<br>auth substack password-auth<br>auth include postlogin<br># Used with polkit to reauthorize users in remote sessions<br>-auth optional pam_reauthorize.so prepare<br>account required pam_nologin.so<br>account include password-auth<br>password include password-auth<br># pam_selinux.so close should be the first session rule<br>session required pam_selinux.so close<br>session required pam_loginuid.so<br># pam_selinux.so open should only be followed by sessions to be executed in the user context<br>session required pam_selinux.so open env_params<br>session required pam_namespace.so<br>session optional pam_keyinit.so force revoke<br>session include password-auth<br>session include postlogin<br># Used with polkit to reauthorize users in remote sessions<br>-session optional pam_reauthorize.so prepare |
再次进入到刚才解压后的软件安装文件目录:
cd openssh-9.0p1/
依次执行如下命令复制一些文件到目标位置(如果目标存在就覆盖掉)
cp -a contrib/redhat/sshd.init /etc/init.d/sshd
cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
执行如下命令来增加运行权限、设置自动启动等:
chmod +x /etc/init.d/sshd
chkconfig --add sshd
systemctl enable sshd
执行如下命令,将原有的systemd管理的sshd文件移走(或者删除),否则影响正常重启sshd服务:
mv /usr/lib/systemd/system/sshd.service /tmp/ssh-ssl/ssh-backup/
执行此命令设置sshd服务开机自动启动:
chkconfig sshd on

执行此命令重启sshd服务:
systemctl restart sshd

没有报错,重启sshd服务正常。
在其它终端通过ssh远程登录,能够正常登录使用;
执行“ssh -V
”命令来查看现在的OpenSSH版本,发现已经是升级后的版本了:

至此,已经成功完成了升级。