Ubuntu16.04 升级ssl到3.5.7、升级ssh到9.8p1 📅 2026/8/20 13:35:05 特别提醒升级ssh是高风险操作升级失败会导致远程无法连接上提前做好各种预防措施。升级思路1.先打开telnet相关服务做好防范2.先升级ssl再升级ssh3.关闭telnet相关服务为防止出现无法连接服务器可以通过打开telnet增加进入服务器的方式。查看是否打开telnetsudo netstat -tlnp | grep :23 #无输出说明telnet服务没打开--------打开telnet相关服务-----------Telnet 是一种极不安全的协议所有数据包括用户名和密码都以明文传输极易被窃取。绝对禁止在公网或任何生产环境中使用 Telnet。在 Ubuntu 16.04 中xinetd 是管理 Telnet 服务的“超级服务器”步骤一安装 Telnet 服务sudo apt-get update sudo apt-get install xinetd telnetd步骤二配置 Telnet 服务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 }保存。步骤三启动服务并设置开机自启重启 xinetd 服务以使配置生效sudo /etc/init.d/xinetd restartsudo systemctl enable xinetd步骤四配置防火墙如果使用 ufwUbuntu 默认sudo ufw allow 23/tcp如果使用 iptablessudo iptables -A INPUT -p tcp --dport 23 -j ACCEPT步骤五验证服务是否开启sudo netstat -a | grep telnet如果看到输出表示 Telnet 服务已在运行并监听问题telnet打开后用原有ssh的root用户名 密码无法登录用 SSH 的 root 密码无法登录 Telnet通常是出于安全考虑系统默认禁止了 root 用户通过 Telnet 直接登录/etc/pam.d/login这个文件控制着登录行为。其中有一行 auth required pam_securetty.so它会调用 pam_securetty 模块来检查 root 登录的终端是否被允许。/etc/securetty这个文件定义了允许 root 用户登录的“安全”终端列表。出于安全考虑pts/*即 Telnet 和 SSH 等远程登录使用的伪终端默认不在这个列表中因此 root 登录会被拒绝。解决办法修改 /etc/securetty 文件推荐sudo vim /etc/securetty末尾增加pts/0pts/1pts/2pts/3pts/4pts/5pts/6pts/7pts/8pts/9pts/10pts/11pts/12至少加到pts/12 ,因为排查日志sudo tail -f /var/log/auth.log 发现有验证pts/9或者pts/11根据情况增加即可。rootuser-UniServer-R4900-G3:~# sudo tail -f /var/log/auth.log Aug 13 16:30:01 user-UniServer-R4900-G3 CRON[32682]: pam_unix(cron:session): session opened for user root by (uid0) Aug 13 16:30:07 user-UniServer-R4900-G3 CRON[32682]: pam_unix(cron:session): session closed for user root Aug 13 16:35:01 user-UniServer-R4900-G3 CRON[35461]: pam_unix(cron:session): session opened for user root by (uid0) Aug 13 16:35:07 user-UniServer-R4900-G3 CRON[35461]: pam_unix(cron:session): session closed for user root Aug 13 16:40:01 user-UniServer-R4900-G3 CRON[38224]: pam_unix(cron:session): session opened for user root by (uid0) Aug 13 16:40:07 user-UniServer-R4900-G3 CRON[38224]: pam_unix(cron:session): session closed for user root Aug 13 16:45:01 user-UniServer-R4900-G3 CRON[320]: pam_unix(cron:session): session opened for user root by (uid0) Aug 13 16:45:07 user-UniServer-R4900-G3 CRON[320]: pam_unix(cron:session): session closed for user root Aug 13 16:49:05 user-UniServer-R4900-G3 sudo: root : TTYpts/9 ; PWD/root ; USERroot ; COMMAND/usr/bin/tail -f /var/log/auth.log Aug 13 16:49:05 user-UniServer-R4900-G3 sudo: pam_unix(sudo:session): session opened for user root by root(uid0)接下来测试用root的账号密码登录协议选择telnet 端口23 是否能登录服务器正常是可以测试成功。--------------升级ssl到3.5.7-------------------备份关键数据# 备份 SSH 配置目录sudo cp -r /etc/ssh /etc/ssh-bak-$(date %F)# 备份 PAM 配置sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.bak# 记录当前版本信息ssh -V ~/ssh_old_version.txt安装编译依赖升级需要编译源码因此必须安装必要的开发工具和库sudo apt-get updatesudo apt-get install -y build-essential zlib1g-dev libssl-dev libpam0g-dev第一步升级 OpenSSL 到 3.5.7OpenSSH 9.8p1 需要 OpenSSL 1.1.1 或更高版本因此需要先升级 OpenSSL。1.下载并解压源码cd /opt # 从官网下载 OpenSSL 3.5.7 源码包 wget https://www.openssl.org/source/openssl-3.5.7.tar.gz tar -xzvf openssl-3.5.7.tar.gz cd openssl-3.5.72.编译与安装# 配置。--prefix 指定安装路径 ./config --prefix/usr/local/ssl -d shared # 开始编译可使用 -j 参数加快速度如 make -j 4 make # 安装 sudo make install3.配置动态链接库让系统能找到新安装的 OpenSSL 库文件# 将库路径加入配置文件echo /usr/local/ssl/lib | sudo tee -a /etc/ld.so.conf# 更新动态链接库缓存sudo ldconfig -v4.验证版本/usr/local/ssl/bin/openssl version如果输出 OpenSSL 3.5.7 ...则说明升级成功。会发现并没有升级成功报错信息如下rootuser-UniServer-R4900-G3:/opt/openssl-3.5.7# /usr/local/ssl/bin/openssl version /usr/local/ssl/bin/openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory echo /usr/local/ssl/lib | sudo tee -a /etc/ld.so.conf echo /usr/local/ssl/lib /etc/ld.so.conf.d/openssl-3.5.7.conf问题原因库文件 libssl.so.3 和 libcrypto.so.3 根本没有被安装到 /usr/local/ssl/lib 目录所以无论怎么配置 ldconfig 都没用。我们需要先确认编译是否真的成功生成了动态库以及 make install 是否正常复制了文件。第一步确认库文件是否在源码目录中生成ls -l /opt/openssl-3.5.7/*.sols -l /opt/openssl-3.5.7/lib*.so第二步检查 /usr/local/ssl 目录下有哪些内容ls -lR /usr/local/ssl | head -30看看是否有 bin、include 等目录但缺少 lib 下的库文件。第三步重新执行安装或手动复制如果编译生成的库在源码目录中可以手动复制到 /usr/local/ssl/libsudo mkdir -p /usr/local/ssl/lib sudo cp -d /opt/openssl-3.5.7/libssl.so* /usr/local/ssl/lib/ sudo cp -d /opt/openssl-3.5.7/libcrypto.so* /usr/local/ssl/lib/ 然后重新运行 ldconfig第四步如果编译没生成动态库重新配置编译cd /opt/openssl-3.5.7 make clean # 清理之前的编译产物 ./config --prefix/usr/local/ssl --openssldir/usr/local/ssl shared -d make -j $(nproc) sudo make install第五步安装成功后更新动态库缓存echo /usr/local/ssl/lib | sudo tee /etc/ld.so.conf.d/openssl-3.5.7.conf sudo ldconfig ldconfig -p | grep libssl # 应该能看到 libssl.so.3第六步验证/usr/local/ssl/bin/openssl version-------------------升级OpenSSH到 9.8p1-------------------------编译并安装 OpenSSH 9.8p11.下载并解压源码cd /opt wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz tar -zxvf openssh-9.8p1.tar.gz cd openssh-9.8p12.配置编译选项这一步很关键需要指定新安装的 OpenSSL 路径./configure --prefix/usr/local/ssh \ --sysconfdir/etc/ssh \ --with-ssl-dir/usr/local/ssl \ --with-zlib \ --with-pam会提示PAM is enabled. You may need to install a PAM control filefor sshd, otherwise password authentication may fail.Example PAM control files can be found in the contrib/subdirectory。说明本步骤安装完成可以继续。3. 编译与安装makesudo make install会发现执行sudo make install后会报错Unable to load host key /etc/ssh/ssh_host_dsa_key: invalid formatUnable to load host key: /etc/ssh/ssh_host_dsa_keyOpenSSH 9.8p1 默认在编译时禁用了 DSA 密钥因为 DSA 算法脆弱且已被弃用。而你的旧系统配置文件 /etc/ssh/sshd_config 中仍然包含加载 DSA 主机密钥的配置行新版的 sshd 不认识或不支持这种密钥格式因此配置测试失败。解决方案手动编辑vim /etc/ssh/sshd_config找到包含 ssh_host_dsa_key 的那一行在前面加 # 注释掉。备份并移除旧的 DSA 密钥文件避免干扰sudo mv /etc/ssh/ssh_host_dsa_key /etc/ssh/ssh_host_dsa_key.baksudo mv /etc/ssh/ssh_host_dsa_key.pub /etc/ssh/ssh_host_dsa_key.pub.bak手动测试新配置是否通过sudo /usr/sbin/sshd -t如果没有任何输出说明配置正确可以继续。重启 SSH 服务sudo systemctl restart sshd验证服务状态和版本sudo systemctl status sshdssh -V更新完后ssh -V 发现ssh和ssl还是没显示更新问题原因make install 已经把新文件安装到了 /usr/local/ssh/sbin/sshd 和 /usr/local/ssh/bin/ssh但尚未复制到系统默认路径所以系统命令仍指向旧文件解决办法1.备份并替换系统二进制文件# 备份旧文件如果之前未备份sudo mv /usr/sbin/sshd /usr/sbin/sshd.bak sudo mv /usr/bin/ssh /usr/bin/ssh.bak sudo mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak # 可选# 复制新编译的文件到系统路径sudo cp /usr/local/ssh/sbin/sshd /usr/sbin/sshd sudo cp /usr/local/ssh/bin/ssh /usr/bin/ssh sudo cp /usr/local/ssh/bin/ssh-keygen /usr/bin/ssh-keygen # 可选2.重启 SSH 服务使新的 sshd 生效sudo systemctl restart sshd3. 验证版本分别在当前会话和新会话中# 查看服务端版本新版支持 -Vsudo /usr/sbin/sshd -V# 查看客户端版本ssh -Vrootuser-UniServer-R4900-G3:/opt/openssh-9.8p1# ssh -V OpenSSH_9.8p1, OpenSSL 3.5.7 9 Jun 2026 rootuser-UniServer-R4900-G3:/opt/openssh-9.8p1# rootuser-UniServer-R4900-G3:/opt/openssh-9.8p1# sudo /usr/sbin/sshd -V OpenSSH_9.8p1, OpenSSL 3.5.7 9 Jun 2026 rootuser-UniServer-R4900-G3:/opt/openssh-9.8p1#------------关闭telnet相关服务 ---------------1.停止 Telnet 服务# 如果使用 xinetd最常见、inetdsudo systemctl stop xinetdsudo systemctl stop inetd2.禁用开机自启sudo systemctl disable xinetdsudo systemctl disable inetd3. 关闭防火墙端口23 端口sudo ufw delete allow 23/tcpsudo iptables -D INPUT -p tcp --dport 23 -j ACCEPT4.验证 Telnet 已关闭sudo netstat -tlnp | grep :23