尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

生产服务器Rocky Linux 9.6 SSH/SSL rpm一键升级实践

发布时间:2026/9/29 17:22:28

资讯中心
01
ARTICLE

生产服务器Rocky Linux 9.6 SSH/SSL rpm一键升级实践

生产服务器Rocky Linux 9.6 SSH/SSL rpm一键升级实践
简介面向需要为Rocky Linux 9.6及RHEL系发行版加固SSH与SSL服务的系统管理员这份一键升级包将OpenSSH提升至10.2p1、OpenSSL提升至3.5.4解决旧版本存在的已知安全漏洞增强加密强度和身份验证能力。压缩包共6个文件包括5个rpm包和1个sh脚本整体大小10.75MBrpm包覆盖openssh客户端、服务端及chkconfig、initscripts等依赖组件sh脚本则负责自动化执行升级流程减少手工编译和配置出错的可能。该升级包兼容Rocky Linux 9.6、Red Hat Enterprise Linux 9.6、Oracle Linux 9.6、AlmaLinux 9.6及CentOS 9等多个发行版适用于内网或生产环境快速完成安全补丁更新。已有144人学习下载尤其适合需要批量运维、快速修复OpenSSH/OpenSSL高危漏洞的IT团队在保证服务连续性的同时提升整体安全水位。1. 生产服务器为什么要盯上 rockylinux9.6-ssh10.2p1-ssl3.5.4-rpm-x86-64一键升级包两年前的等保整改现场我守着十几台 Rocky Linux 9.6 的服务器安全扫描报告里清一色躺着 OpenSSH 和 OpenSSL 的中高危 CVE。系统自带的 OpenSSH 9.3p1、OpenSSL 3.0.7在 2025 年的时间点上已经属于“能跑但不敢保证安全”的版本组合。当时最头疼的不是下载源码编译而是几十台机器要保持版本一致、不能一台台手工 configure。后来我把编译好的二进制打成了 rpm做成了标题里这个 rockylinux9.6-ssh10.2p1-ssl3.5.4-rpm-x86-64 一键升级包内网分发、批量升级、可回滚一套流程走完再也没为 SSH/SSL 版本发过愁。这篇文章就把这套方案完整拆开rpm 包里该装什么、升级脚本怎么写、哪些参数必须调、哪些坑我替你先踩过。适合手里攒了一堆 Rocky Linux 9.x 服务器、正被漏洞扫描报告追着跑的运维也适合刚接触 rpm 打包、想理解升级链路的入门者。2. 升级前的状态确认备份、依赖与 rpm 包自检直接拿 rpm 升级 OpenSSH/OpenSSL最容易翻车的地方是“系统里已有版本和新版本互相打架”。在做任何操作之前先把现状摸清楚。我一般会在一台测试机上完整走一遍这套检查确认没问题再铺到生产。2.1 确认系统版本与当前 SSH/SSL 基线升级包标题写的是 rockylinux9.6但实际机器可能是 9.2、9.4或者 9.6 的小版本没跟上。先看系统版本cat /etc/rocky-release # 输出示例Rocky Linux release 9.6 (Blue Onyx) ssh -V # 输出示例OpenSSH_9.3p1, OpenSSL 3.0.7 4 Feb 2023 openssl version -a # 输出示例OpenSSL 3.0.7 4 Feb 2023逻辑说明/etc/rocky-release确认大版本是否属于 9.x 系列因为 8.x 和 9.x 的 rpm 依赖库完全不同升级包里的 rpm 在 8.x 上强行安装会直接报依赖缺失。ssh -V和openssl version是给你留个“升级前基线”万一升级后出问题要靠这两个输出判断二进制是否真的被替换成功。参数说明如果系统是 9.2 或 9.4 这种小版本通常也能装上但前提是 glibc 版本不低于 rpm 包编译时的要求。后面用ldd检查动态库时再细说。2.2 备份现有配置与二进制留后悔药升级 OpenSSH 最怕的不是装不上而是装完后 sshd 起不来人已经被踢出机房。所以备份必须包含两类配置文件和原始二进制。mkdir -p /root/backup_ssh_ssl_20250115 cp -a /etc/ssh /root/backup_ssh_ssl_20250115/etc_ssh_bak cp -a /etc/pki /root/backup_ssh_ssl_20250115/etc_pki_bak cp -a /etc/pki/tls/openssl.cnf /root/backup_ssh_ssl_20250115/ 2/dev/null # 备份原始二进制rpm 升级前先拷出来 cp -a /usr/bin/ssh /root/backup_ssh_ssl_20250115/usr_bin_ssh cp -a /usr/sbin/sshd /root/backup_ssh_ssl_20250115/usr_sbin_sshd cp -a /usr/lib64/libcrypto.so.3 /root/backup_ssh_ssl_20250115/libcrypto_ssh_ssl.so.3逻辑说明cp -a保留权限和软链接属性OpenSSL 的.so.3结尾是版本化符号链接如果只拷文件不拷链接恢复时会出现库文件找不全的问题。/etc/pki里面是证书和私钥的存放路径升级 OpenSSL 不会动这些文件但备份了能让你在升级后排查证书加载问题时多一个对照组。参数说明备份目录我习惯带日期方便后续滚动清理。不要用tar打包完就删原文件因为升级过程中如果/usr/bin/ssh文件被覆盖你还能直接从备份目录用全路径执行比如/root/backup_ssh_ssl_20250115/usr_bin_ssh -V。这条在紧急恢复时能救命。2.3 rpm 包完整性自检签名与依赖拿到了升级包之后第一件事不是安装而是验证这个 rpm 包本身没被篡改、依赖声明是否完整。rpm -K *.rpm # 输出的最后一行如果有 OK说明 GPG 签名校验通过 rpm -qRp *.rpm | grep -E libcrypto|libssl|glibc|pam # 查看这几个 rpm 包的依赖声明里引用了哪些动态库 ldd /usr/sbin/sshd # 回到当前系统上执行看升级前 sshd 链接了哪些 libcrypto逻辑说明rpm -K是校验包里附带的 GPG 签名内网拿到包之后如果是从 U 盘拷贝的这一步能确认包没有被传输损坏。rpm -qRp列出 Requires也就是这个包安装时需要系统提供哪些库。重点看libcrypto.so.3和libssl.so.3后面的版本括号比如(GLIBC_2.34)这是编译时链接的 glibc 符号版本宿主机 glibc 太老的话会报version GLIBC_2.34 not found。参数说明rpm -K如果输出MISSING GPG SIGNATURE并不代表包一定有问题只说明构建方没有签名。自己内网编译的包经常不签只要来源可信即可。但如果是官方渠道下载的包出现这个提示就要警惕了。3. 用 rpm 本地仓库跑通一键安装脚本拆解与参数说明这一章是核心操作。我把 rpm 包放到内网机器上的统一目录然后用一个脚本完成从本地安装到版本验证的完整流程。标题里“一键升级包”的“一键”本质就是这一段脚本。3.1 升级包的目录结构与安装顺序先看升级包解压后的标准结构tree /data/update_ssh_ssl/ # 输出示例 /data/update_ssh_ssl/ ├── packages/ │ ├── openssl-3.5.4-1.x86_64.rpm │ ├── openssl-libs-3.5.4-1.x86_64.rpm │ ├── openssl-devel-3.5.4-1.x86_64.rpm │ ├── openssh-10.2p1-1.x86_64.rpm │ ├── openssh-clients-10.2p1-1.x86_64.rpm │ └── openssh-server-10.2p1-1.x86_64.rpm ├── install_update_ssh_ssl.sh └── rollback_ssh_ssl.sh逻辑说明openssl是命令行工具包openssl-libs是运行时动态库libcrypto.so.3、libssl.so.3openssl-devel是编译依赖用的头文件包。升级 ssh 时其实只强制要求openssl-libs存在但为了避免以后编译业务软件时头文件版本不一致我会把devel也一起装。openssh-server提供 sshd 服务openssh-clients提供 ssh、scp、sftp 等客户端工具。安装顺序有讲究先装openssl系列再装openssh系列。因为 OpenSSH 10.2p1 的链接目标里有新版本的 libcrypto如果旧 libcrypto 还在sshd 可能链接到旧的库上跑起来虽然不报错但新版本特性不生效。3.2 一键安装脚本的核心逻辑#!/bin/bash # install_update_ssh_ssl.sh set -e set -u PKG_DIR/data/update_ssh_ssl/packages BACKUP_DIR/root/backup_ssh_ssl_$(date %Y%m%d) LOG_FILE/var/log/update_ssh_ssl_$(date %Y%m%d).log # 1. 备份关键路径 mkdir -p ${BACKUP_DIR} cp -a /etc/ssh ${BACKUP_DIR}/etc_ssh cp -a /etc/pki ${BACKUP_DIR}/etc_pki echo [$(date %F %T)] 配置备份完成: ${BACKUP_DIR} | tee -a ${LOG_FILE} # 2. 本地安装 openssl 系列 rpm -Uvh --replacepkgs \ ${PKG_DIR}/openssl-3.5.4-1.x86_64.rpm \ ${PKG_DIR}/openssl-libs-3.5.4-1.x86_64.rpm \ ${PKG_DIR}/openssl-devel-3.5.4-1.x86_64.rpm # 3. 刷新动态链接器缓存 ldconfig # 4. 本地安装 openssh 系列 rpm -Uvh --replacepkgs \ ${PKG_DIR}/openssh-10.2p1-1.x86_64.rpm \ ${PKG_DIR}/openssh-clients-10.2p1-1.x86_64.rpm \ ${PKG_DIR}/openssh-server-10.2p1-1.x86_64.rpm # 5. 重新生成 host key防止覆盖后 sshd 起不来 ssh-keygen -A -v ${LOG_FILE} 21 # 6. 检查 sshd 配置语法 sshd -t echo [$(date %F %T)] sshd 配置语法检查通过 | tee -a ${LOG_FILE} # 7. 重启 sshd systemctl restart sshd # 8. 验证版本与端口 ssh -V openssl version ss -lnt | grep :22 echo [$(date %F %T)] 升级完成 | tee -a ${LOG_FILE}逻辑说明set -e和set -u脚本里任何一条命令返回非零就立即终止变量没定义就报错。升级场景里这是保护机制避免某个 rpm 安装失败后脚本继续往下走最后 sshd 起不来你还没看到报错。rpm -Uvh里的-U是升级upgrade-v是显示详细输出。--replacepkgs允许覆盖已安装的同版本包防止因为包版本号一致而被 rpm 跳过。ldconfig这一步很多人会漏掉。OpenSSL 的.so.3动态库安装后需要刷新动态链接器缓存不执行的话有些用旧 libcrypto 起着的进程还在跑新进程可能加载不到新库。ssh-keygen -A是重新生成缺失的主机密钥host key。rpm 安装不会删除已有的/etc/ssh/ssh_host_*_key但如果之前手动清理过这一步会自动补齐。sshd -t是纯语法检查不会真的启动服务。它连配置文件都能校验比如Port参数写错、Include文件不存在都会在这一步暴露。参数说明如果你不希望任何配置依赖--replacepkgs特性的场景直接去掉这个参数rpm 在遇到同版本包时会跳过安装并返回 0脚本也不会中断。但既然是一键升级包保留它更省心。3.3 为什么不建议用 yum update 直接跑很多人会问为什么不直接yum update openssh openssl答案在于 Rocky Linux 官方仓库里的版本可能还停留在 9.3p1而标题要的是 10.2p1。手动编译后打成 rpm就是绕过官方仓库的版本滞后。另一个原因是 yum 在解决依赖时会优先满足系统里已有包的依赖约束而内网这批服务器的依赖环境我并没有打算让 yum 去“智能”调整。用本地 rpm 目录安装还有一个附加好处可以精确控制哪台机器先升级、哪台机器后升级。如果几十台机器一把梭升级到一半发现库冲突恢复成本会很高。4. 升级后的 sshd 配置与 ssl 验证从进程起来到真实业务跑通升级完成不等于收工。我见过太多机器 sshd 进程起来了但远程登录直接报Unable to negotiate或者no matching cipher found。这一章讲清楚新版本配置落地的三个关键动作。4.1 新版 sshd 配置里必调的 5 个参数OpenSSH 10.2p1 相比 9.x 的默认策略更激进很多老算法开关默认变了。我给这批服务器统一调整的参数如下写在/etc/ssh/sshd_config# 明确允许密钥登录禁止密码登录按生产策略决定我这边默认关密码 PubkeyAuthentication yes PasswordAuthentication no # 禁止 root 通过密码登录允许密钥登录 PermitRootLogin prohibit-password # 关闭 DNS 反查减少登录延迟和 DNS 故障导致的连接卡顿 UseDNS no # 会话保持防止网络抖动断连 ClientAliveInterval 300 ClientAliveCountMax 2 # 老算法最小位长限制 KexAlgorithms curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group-exchange-sha256逻辑说明这些参数不是新版本特有的但 10.2p1 对某些默认值做了收紧。比如ClientAliveInterval 300表示每 300 秒发送一次保活包超过ClientAliveCountMax次没收到响应就断开。原先很多机器不配这个参数长连接挂一晚上就断升级到新版本后因为加密套件握手策略变化触发概率更高。PasswordAuthentication no是我内网服务器统一策略如果你的机房没有统一跳板机先保持yes等密钥分发完再切。参数说明KexAlgorithms这一行是硬性建议。10.2p1 默认已经移除diffie-hellman-group14-sha1这类老算法但如果你不显式声明老客户端比如 CentOS 6 上的 OpenSSH 5.3 客户端仍然尝试用老算法连接会直接收到no compatible key exchange method的报错。列出来的四个算法兼容性和安全性都够用前两个是主推后两个是老客户端兼容的底线。4.2 重启前的语法检查与滚动重启技巧# 语法检查 sshd -t # 如果输出空说明配置无误 # 在不中断现有连接的情况下重启 sshd systemctl reload sshd # 或者强制重启前先确认一条备用连接已经建立 nohup systemctl restart sshd 逻辑说明sshd -t只检查语法不会真正加载配置。systemctl reload对 sshd 而言是发送 SIGHUP 信号让主进程重新读取配置这个操作不会踢掉现有连接。但如果新配置里有Port这种监听地址的修改reload 可能不生效必须 restart。nohup systemctl restart sshd 这行是保命操作你得确保自己不是唯一一条连接否则 restart 瞬间网络抖动你会被卡在门外。参数说明systemctl reload sshd是否支持取决于/usr/lib/systemd/system/ssh.service里的ExecReload行。Rocky Linux 9.6 自带的 unit 文件里默认有这一行如果你的 rpm 包是自己打的服务文件一定要确认 unit 文件里写了ExecReload/bin/kill -HUP $MAINPID之类的行否则 reload 会被 context 忽视。4.3 用 openssl 命令验证新版本与密码套件升级 OpenSSL 之后业务系统比如 nginx、mysql 是否真的在用新库需要直接验证。# 查看当前生效的 OpenSSL 版本 openssl version -a # 或指定二进制查看 /usr/bin/openssl version # 查看 libcrypto/libssl 实际指向 ls -l /usr/lib64/libcrypto.so.3 ls -l /usr/lib64/libssl.so.3 # 测试目标 HTTPS 服务器是否支持新密码套件 echo | openssl s_client -connect 192.168.1.10:443 -tls1_3 2/dev/null | grep -E New, TLSv1.3|Cipher is逻辑说明openssl s_client是 OpenSSL 自带的测试工具能模拟客户端去连接任意 TLS 服务。重点看输出的New, TLSv1.3和Cipher is这两行如果握手成功说明服务端证书和密码套件都兼容。2/dev/null是过滤掉证书链的提示信息否则输出会很长。ls -l /usr/lib64/libcrypto.so.3这条检查软链接是否指向新版本文件如果升级后链接还指向旧版本多半是ldconfig没执行或者包没装对。参数说明-tls1_3强制用 TLS 1.3 协议测试如果服务端只开了 TLS 1.2你会看到no protocols available的报错。这时候把参数换成-tls1_2再测用来确认服务端是否支持旧协议。生产环境我一般两头都测因为老客户端连不上时能快速判断问题出在哪端的配置。5. 升级 ssh 与 ssl 必踩的 5 个坑现象、原因与解决这部分是我在这类升级里积累的实战经验。每一条都对应真实发生过的事件按“现象 → 原因 → 解决”的顺序记录。5.1 坑 1远程连接升级到一半直接断开再也连不上现象顺手改完 sshd_config 后执行systemctl restart sshd当前终端立刻卡死几秒后连接断开。再尝试连接时报错Connection refused或直接超时。原因restart 会杀掉所有 sshd 子进程当前会话也被中断。更麻烦的是如果新 sshd 因为配置错误没起来监听端口的进程就不存在了。很多情况是sshd -t检查时没发现Include /etc/ssh/sshd_config.d/*.conf文件里有冲突restart 时真正加载到冲突配置才挂掉。解决重启用nohup或at延迟执行给意外留出恢复窗口。具体操作是开两个终端一个里执行systemctl restart sshd另一个里提前写好一条恢复命令比如cp /root/backup_ssh_ssl_*/etc_ssh/sshd_config.bak /etc/ssh/sshd_config systemctl restart sshd放旁边准备执行。如果 restart 后 10 秒内新连接不上立刻用带外管理idrac/IPMI或本机控制台执行恢复。5.2 坑 2rpm 安装时提示依赖冲突openssl-libs 版本被系统锁定现象执行rpm -Uvh openssl-libs-3.5.4-1.x86_64.rpm时报错说libcrypto.so.3被openssh-clients或某个业务包依赖更新会破坏依赖关系。原因rpm 的依赖解析是全局的。如果系统里某个既有 rpm 包声明了libcrypto.so.3()(64bit)这个依赖并且 rpm 数据库里记录的是旧版本提供的符号新包升级后符号还在但 rpm 在事务校验时发现版本号跳变过大会保守地阻止安装。另外某些第三方软件是手动解压的不通过 rpm 管理它们对 libcrypto 的依赖不受 rpm 约束但可能实际链接的是旧库版本。解决先rpm -e --nodeps卸载阻碍升级的旧 openssl-libs然后立刻安装新包再用rpm --rebuilddb重建依赖数据库。但卸载有风险我更推荐的做法是用rpm -Uvh --nodeps --force强制覆盖升级完立即ldconfig。生产环境操作前先快照虚拟机或物理机系统盘。5.3 坑 3升级后 nginx/mysql 报 SSL 错误业务接口全部调不通现象OpenSSL 升级完成后 ssh 登录正常但 nginx 启动时日志报SSL_CTX_new: error:140A90F1或类似的库初始化失败mysql 连不上报SSL connection error。原因nginx 和 mysql 在编译时链接的是旧版libssl.so.3升级后动态链接器加载到的库版本变了但它们的 ABI 调用方式和旧版库的某个内部实现不匹配。最常见的其实是这些服务没重启还在用旧进程里加载的旧库新进程又加载了新库造成新旧库文件句柄混用。解决升级 OpenSSL 后所有依赖它的业务服务必须逐一重启。常见做法是升级完先执行ldconfig然后依次systemctl restart nginx mysqld。重启无效果的用lsof -p pid | grep libssl检查进程实际加载的库路径如果是旧路径说明服务启动脚本里写了硬编码的LD_LIBRARY_PATH把这条环境变量改掉再重启。5.4 坑 4升级后密码登录直接报 Permission denied密钥登录却正常现象升级到 OpenSSH 10.2p1 后用密码登录提示Permission denied (password)但用密钥可以正常登录。sshd 日志里能看到pam_unix(sshd:auth): authentication failure。原因10.2p1 默认启用了更严格的 PAM 策略最常见的原因是/etc/ssh/sshd_config里的PasswordAuthentication默认值变了或者 PAM 配置引用了新版本里不存在的模块名。比如sshd的 PAM 堆栈/etc/pam.d/sshd里写了pam_tally2.so这种老模块新版本改成了pam_faillock.soPAM 初始化失败就会直接拒绝密码验证。解决进系统后对比/etc/pam.d/sshd和备份目录里的旧版本逐行确认模块名是否还存在。老版本常用的pam_tally2.so在 Rocky Linux 9.6 上已经被pam_faillock.so取代。把不存在的模块注释掉或者将升级包自带的 pam 配置覆盖过去再重启 sshd问题就能解决。5.5 坑 5SELinux 开启状态下 sshd 无法启动journal 里报权限错现象升级完成后systemctl start sshd报Failed to start OpenSSH server daemonjournal 日志里能看到setcontext相关的权限错误。原因新安装的openssh-server如果把配置文件放到了非标准路径或者 rpm 包构建时没有打上 SELinux 文件上下文标签sshd 主进程就无法在 enforcing 模式下正常启动。特别是我们这类自定义 rpm 升级包构建时没做过semodule -i和文件上下文标注SELinux 就把新文件当成未标记文件处理了。解决先临时把 SELinux 切到 permissive 验证是不是它的原因setenforce 0能起来说明就是上下文问题。再把/etc/ssh和/usr/sbin/sshd的文件上下文恢复restorecon -Rv /etc/ssh /usr/sbin/sshd。确认无误后setenforce 1切回 enforcing。如果 restorecon 解决不了用semanage fcontext -a -t sshd_exec_t /usr/sbin/sshd手动打标签。6. 把一键包吃透内网仓库化、幂等与回滚的收尾工作升级包做完之后我更习惯把它做成内网 yum 仓库而不是每次拿 U 盘跑脚本。思路很简单把packages/目录复制到内网某台机器执行createrepo生成仓库元数据然后在客户端添加一个.repo文件。这样以后任何新机器只要yum install openssh-server-10.2p1 openssl-3.5.4就能装到同一套版本。仓库化的额外好处是yum deplist能帮你提前看清依赖关系避免手工rpm -Uvh时踩到 5.2 那样的依赖坑。幂等性方面我在脚本开头加了版本判断逻辑。用openssl version和ssh -V提取当前版本号如果已经大于等于目标版本就跳过安装直接输出提示。这个判断对批量场景特别重要因为几十台机器里可能有几台提前升过了再跑一遍会浪费时间还可能触发不必要的重启。回滚操作我单独写了一页脚本核心是rpm -Uvh --oldpackage加备份包路径。比如想退回 OpenSSH 9.3p1用备份目录里保存的旧 rpm 包执行rpm -Uvh --oldpackage openssh-server-9.3p1-1.x86_64.rpm就能把版本降回去。这里有个前置条件备份的旧 rpm 包必须是系统里安装时的原始包如果你是从官方仓库装的备份目录里应该已经有对应的 rpm 文件如果当初是手工编译的回滚就只能靠 2.2 节里备份的二进制了。我自己的习惯是任何批量升级前先在一台测试机上完整跑一遍记录所有输出然后拿着测试机生成的文件清单和真实生产机的清单做对比确认没有多删多余链路后再放量。做运维久了就会发现所谓“一键升级包”真正的价值不是省掉那几条命令而是把分散在日常操作里的判断和兜底固化成了一套可重复执行的流程。这套流程跑顺了版本升级就不再是每次都要提心吊胆的大工程。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。