统信UOS aarch64环境自编译OpenSSH 9.6p1 RPM完整指南

发布时间:2026/10/13 10:37:01
统信UOS aarch64环境自编译OpenSSH 9.6p1 RPM完整指南
简介面向统信UOS aarch64架构运维人员的OpenSSH升级安装包无需更换系统即可将旧版OpenSSH平滑升级至9.6p1解决旧版安全漏洞及合规扫描问题适用于内网环境、版本收敛和国产化替代后的安全加固场景。资源共4个文件核心为主程序、客户端、服务端三个rpm包以及一个自动升级脚本全部体积仅1.5MB轻量适配统信UEL20-aarch64环境rpm包覆盖服务端与客户端脚本则提供一键式升级入口。脚本内置备份、安装顺序与重启逻辑可减少手工误操作适合国产化环境下的批量运维或单机升级并为升级失败提供回退保障。已有1286人学习/下载在OpenSSH漏洞频发、国产系统补丁滞后的背景下具有较强实用价值尤其适合安全基线检查前集中整改。取用后可快速获得可直接rpm安装的三个构件和配套脚本显著降低在统信UOS aarch64上自行编译升级的时间成本相比源码方式这套包已处理依赖与架构匹配落地更省心。1. 统信 UOS 的 aarch64 环境上为什么要自己打 OpenSSH 9.6p1 的 rpm统信 UOS 的 aarch64 服务器在安全扫描里几乎必然报 OpenSSH 版本过低默认源里的 ssh 往往停留在 7.x 或老旧的 8.xCVE 一抓一把。直接下载网上散落的二进制又不敢往生产上放架构不匹配、依赖对不上、glibc 版本冲突任何一个问题都能让你在凌晨三点被叫起来。自己拿源码打一个适配 UOS 的 rpm 安装包其实是一条绕不开的路既能精准控制编译参数又能解决批量分发和卸载回退的问题。这篇笔记适合正在做国产化替代、运维信创环境、或者被安全基线逼着升级 OpenSSH 的工程师我按自己实际操作过的流程把每一步拆开讲从环境准备到 spec 编写从装包到翻车自救全程用命令说话。2. 动手前的评估UOS aarch64 环境确认、依赖摸底和备份方案2.1 先搞清楚你的系统和当前 SSH 状态不管你是刚拿到一台新机器还是准备在生产上动手第一步永远是确认当前状态。我在某次操作中接手的一台 UOS 机器表面看是 aarch64但实际跑的内核和 glibc 版本会直接影响 OpenSSH 能不能编过去。用这几条命令把底数摸清uname -m cat /etc/os-release ssh -V 21 rpm -qa | grep -E openssh|openssl先看uname -m确认是 aarch64再看/etc/os-release里的 VERSION_ID 和 PRETTY_NAMEUOS 的 20 系列和 1050 系列在依赖版本上差别不小。ssh -V 21这行后面的 21 别省因为 ssh -V 打印的是 stderr不重定向你什么都看不到。最后把系统里已经装的 openssh 和 openssl 版本列出来这决定了你升级到 9.6p1 之后 rpm 会不会因为依赖关系把老包顶掉。检查完版本之后我还习惯顺手看下当前 sshd 的配置和登录状态ss -tlnp | grep :22 systemctl status sshd --no-pager -l这一步是为了记录升级前的端口监听状态和 sshd 运行参数后面升级完做对比用的。-l参数在 systemctl status 里能显示完整日志不会截断关键报错。2.2 OpenSSL 版本是打包成败的胜负手OpenSSH 9.6p1 编译时对 OpenSSL 的最低要求是 1.1.1但 UOS 自带的 openssl 很可能是 1.1.1 的老修订版甚至有的方案里还带着 1.0.2。如果你在 configure 阶段看到OpenSSL header version does not match library这类报错就是头文件和库版本不一致——这是我在打包过程中遇到的第一类典型问题。比较省心的做法是先统一编译链上的 OpenSSL。你不需要把系统 openssl 替换掉那会牵连太多依赖正确姿势是在打包 OpenSSH 时指定独立的 openssl 路径。我一般把新 openssl 装到/usr/local/openssl然后编译 OpenSSH 时用--with-ssl-dir指过去。下面是我常用的 openssl 构建参数./config --prefix/usr/local/openssl --openssldir/usr/local/openssl shared zlib make -j$(nproc) make install参数说明--prefix指定安装路径--openssldir指配置文件的查找路径shared编出动态库zlib启用压缩支持。编译完之后记得检查/usr/local/openssl/lib下有没有libcrypto.so和libssl.so并确认软链指向新版本cd /usr/local/openssl/lib ln -sf libcrypto.so.1.1 libcrypto.so ln -sf libssl.so.1.1 libssl.so cd - /usr/local/openssl/bin/openssl version2.3 备份升级 SSH 之前必须留的后悔药OpenSSH 升级最怕的不是编译失败而是装完新包之后 sshd 起不来远程直接断掉你只能去机房或者靠带外管理卡。所以在打 rpm 之前就要想好备份方案。备份分三层系统里现有的 openssh rpm 包要留好、sshd 配置目录要整个拷贝、关键系统库的软链关系要记录。我习惯把这三个备份放在同一个目录下命名带时间戳mkdir -p /root/ssh-upgrade-backup/$(date %Y%m%d) cd /root/ssh-upgrade-backup/$(date %Y%m%d) cp /etc/ssh/sshd_config ./ cp /etc/ssh/ssh_config ./ cp -a /etc/pam.d/sshd ./ rpm -qa | grep openssh rpm-origin-list.txt ss -tlnp | grep :22 port-info.txtcp -a保留属主、权限和时间戳pam 配置这层很多人忽略其实升级后 ssh 登录失败经常就是 pam 文件没配对。rpm-origin-list.txt里记录的旧包列表用于回退时确认要还原哪些包。这些备份文件建议压缩后拷贝到另一台机器上避免本机宕机后连备份都拿不到。提示如果你的机器开启了 SELinux还要记一下 sshd 相关的 context常见做法是ls -Z /usr/sbin/sshd保存输出之后还原文件时对照着改。3. 写 spec 打包 OpenSSH 9.6p1从 configure 到 rpm 的全过程3.1 准备源码包和构建目录结构rpmbuild 需要一套固定的目录结构用久了你会发现这套结构本身就是约定不按它来 rpmbuild 会直接报错。先创建目录并放置源码包mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} cd ~/rpmbuild/SOURCES wget https://mirrors.xxx/pub/OpenBSD/OpenSSH/portable/openssh-9.6p1.tar.gz wget https://mirrors.xxx/pub/OpenBSD/OpenSSH/portable/openssh-9.6p1.tar.gz.asc镜像站点地址按你网络实际能访问的来填只要能拿到官方 tar.gz 就行。tar.gz.asc 是用来做签名校验的有 GPG 公钥的话最好验一把虽然内网环境经常因为公钥不在本地而失败但至少能确认下载完整性。源码包就位之后先解压看下有没有补丁要打比如 PAM 相关的 patch。UOS 本身就带 PAM所以 OpenSSH 的--with-pam一般来说要用上。3.2 spec 文件的关键段落详解spec 是整个打包流程的灵魂我直接贴一份可用的模板再逐段解释。这套模板我在 UOS 20 和 1050 系列上都编过只要环境不是太老基本能过Name: openssh Version: 9.6p1 Release: 1%{?dist} Summary: An open source implementation of SSH protocol License: BSD URL: https://www.openssh.com/ Source0: openssh-%{version}.tar.gz BuildRequires: gcc, make, openssl-devel, pam-devel, zlib-devel Requires: openssl, pam, zlib %description OpenSSH 9.6p1 for UOS aarch64. %prep %setup -q -n openssh-%{version} %build ./configure --prefix/usr \ --sysconfdir/etc/ssh \ --with-ssl-dir/usr/local/openssl \ --with-pam \ --with-zlib/usr/local/zlib \ --with-md5-passwords \ --mandir/usr/share/man make -j$(nproc) %install make install DESTDIR%{buildroot} install -d %{buildroot}/etc/ssh install -m 600 %{buildroot}/etc/ssh/sshd_config %{buildroot}/etc/ssh/ 2/dev/null || true逐段说明。Name和Version直接决定 rpm 包的命名和版本如果你想保留系统原有的 openssh-server 包名以便依赖关系平滑Name 就维持 openssh 不要改。Release里的%{?dist}在有定义 dist 的环境会生成.uos之类的后缀没有也不影响。BuildRequires列出编译期依赖缺哪个编译都会中断。如果在 configure 时报pam_appl.h not found就是 pam-devel 没装。Requires是运行期依赖这里有点讲究如果你用--with-ssl-dir指到了非系统路径那么再Requires: openssl就会强制系统里还要有 openssl 包。实际上 sshd 运行时会优先找系统库路径最好用下面这种写法规避Requires: pam, zlib %define _use_internal_dependency_generator 0%setup -q -n openssh-%{version}里的-n指定解压后的目录名因为官方 tar 包解出来的目录就是openssh-9.6p1。如果不写-nrpmbuild 默认会用%{name}-%{version}去猜那就是openssh-9.6p1刚好对得上但为了保险还是显式写出来。3.3 编译参数怎么选prefix、pam 和 ssl-dir 的取舍--prefix/usr是我比较推荐的安装路径这样 sshd 会装到/usr/sbin/sshd和老包位置一致运行时不容易出现路径错乱。如果你指定--prefix/usr/local就要手动处理/etc/init.d/sshd脚本里的路径否则 service 启动会找不到二进制这是很多人升级后重启 sshd 失败的原因。--with-pam是关键选项。UOS 默认登录验证走 PAM不编 PAM 支持的话密码登录会出现Permission denied但日志里没有任何报错。编了 PAM 之后还要在%install阶段把contrib/sshd.pam装到/etc/pam.d/sshd这就是前面备份 pam 配置时提到的原因。--with-md5-passwords是适配 UOS 用户密码哈希的一个补丁式选项。UOS 的老版本用户密码可能存的是 MD5 格式OpenSSH 8.x 之后默认禁用了 MD5 密码认证不打开这个选项系统用户用密码登录会一直被拒。虽然 9.6p1 本身对 md5 的支持已经内部处理了但加上这个选项能减少一票现场问题。构建目录里最好放一个构建日志我当时是把整个 make 输出重定向到文件里方便出问题回溯rpmbuild -ba ~/rpmbuild/SPECS/openssh.spec /root/build-ssh9.6p1.log 213.4 打完包之后先检查一遍再分发rpmbuild 结束后在~/rpmbuild/RPMS/aarch64/下能看到生成的 rpm 包。别急着装先检查包的内容和依赖cd ~/rpmbuild/RPMS/aarch64/ rpm -qpl openssh-9.6p1-1.aarch64.rpm rpm -qpR openssh-9.6p1-1.aarch64.rpmrpm -qpl列出包内文件清单确认 sshd 和 ssh_config 都在预期位置。rpm -qpR列出运行时依赖检查有没有诡异的libcrypto.so.10之类你不希望出现的硬依赖。如果发现依赖不对多半是 configure 阶段链接了系统旧库回编译前调整一下--with-ssl-dir路径就行。到这里 rpm 包已经躺在你手上了接下来进入安装环节。安装环节就是真正考验备份和回退策略的时刻。4. 部署到目标机器rpm 安装、sshd 重启和回退方案4.1 安装新包前确认分发方式如果你是在测试机上演练直接本地安装就行。生产上有多台同构机器的话建议把 rpm 包放到内网源里用yum localinstall装而不是rpm -Uvh硬装。yum localinstall的好处是自动解析依赖比如你依赖 pam-devel它会提示你装哪几个包。yum localinstall -y openssh-9.6p1-1.aarch64.rpm装的时候注意看输出yum 会告诉你哪些旧包被替换掉。UOS 自带的 openssh-server 和 openssh-clients 可能没有拆分是一个 openssh 包扛所有所以你打 rpm 时如果按 server 和 client 拆包就要留意新旧包名差异。4.2 安装后服务的启动流程和配置兼容rpm 安装完成之后服务不会自动重启需要手动拉起systemctl daemon-reload systemctl restart sshd systemctl status sshd --no-pager -ldaemon-reload这步很多人会漏。因为新 rpm 里带的/usr/lib/systemd/system/sshd.service和你系统里现有的可能同名但内容不同不 reload 的话 systemd 还在用内存里的旧 unit 定义。之后restart才会真正加载新二进制。查看状态后确认一下端口和进程ss -tlnp | grep :22 ps -ef | grep sshd | grep -v grep正常情况下你会看到sshd监听在0.0.0.0:22。如果进程不存在立刻看/var/log/secure或者journalctl -u sshd -n 50。这一步要快因为你已经可能在断连的边缘。4.3 激活 PAM 验证和新配置兼容我这里要特别提一句从源码打出来的 rpm 安装后/etc/pam.d/sshd这个文件不一定被覆盖。UOS 系统里已有的 pam 文件可能带着系统特有的配置如果你直接替换成 OpenSSH 源码包里的版本遇到多因子认证或账号锁定策略时会出现异常登录行为。所以我安装后一般不主动动 pam 文件先保留系统原有的。然后验证密码登录是否正常tail -f /var/log/secure systemctl restart sshd在另一终端用密码试一下登录能登进去再放开。如果登录失败去journalctl -u sshd里找pam_unix的报错关键词再回头检查 pam 文件是否匹配。4.4 回退装坏了想还原别慌回退的逻辑是把你备份的旧 rpm 装回去。前提是你之前备份的rpm-origin-list.txt还找得到rpm -Uvh --force /root/ssh-upgrade-backup/$(date %Y%m%d)/backup-openssh*.rpm但这里有个坑如果当时你没把旧 rpm 留存系统里可能找不到旧包可退。所以在升级前我一般会把当前 rpm 包直接导出mkdir -p /root/old-rpms for pkg in $(rpm -qa | grep openssh); do rpm -ql $pkg /dev/null 21 yumdownloader --destdir/root/old-rpms $pkg doneyumdownloader需要yum-utils包没有就先yum install -y yum-utils。导出后回退时rpm -Uvh --force /root/old-rpms/*.rpm就行。回退完成后再把备份的 sshd_config 覆盖回去重启服务。提示回退之后一定要看/var/log/secure确认 sshd 正常启动不要以为 rpm 装回去服务就自动好了配置文件可能已被新包改动。5. 避坑与常见问题升级 OpenSSH 到 9.6p1 的四个血泪经验5.1 现象configure 报OpenSSL header version does not match library原因你在--with-ssl-dir指向的目录里头文件是新版本但库文件软链还指向旧版本编译器以头文件为准去链库发现版本不一致直接退出。解决检查/usr/local/openssl/include/openssl/opensslv.h里的版本号和/usr/local/openssl/lib下的实际库文件软链。我遇到的情况是头文件已经更新到 3.0但 libcrypto.so 还指向 1.0.2执行ln -sf重建软链后重新make clean再跑 configure。经验是每回升级 openssl 之后顺手重建一下软链别偷懒。5.2 现象rpm 安装后 sshd 服务启动失败journal 里报sshd: error while loading shared libraries原因用--with-ssl-dir链接的新版本 openssl 库放在了/usr/local/openssl/lib但系统运行时的 ld 缓存没包含这个路径。sshd 起来时找不到libcrypto.so.3这个文件直接加载失败。解决把路径写入 ld 配置执行echo /usr/local/openssl/lib /etc/ld.so.conf.d/openssl-local.conf ldconfig然后ldd /usr/sbin/sshd | grep crypto确认能链到新库。这个问题最容易在拷贝 rpm 到新机器安装时出现——本地编译机你可能已经改了 ld 配置目标机没有分发安装后当场翻车。5.3 现象升级后密码登录报Permission denied (publickey,password)日志无 PAM 报错原因md5 密码选项没打开或者 pam 文件不匹配。OpenSSH 9.x 默认禁止空密码和 md5 加密的密码哈希而 UOS 老机器的/etc/shadow里可能还留着 md5 格式的哈希。解决在 spec 里加上--with-md5-passwords重新打包或者临时在/etc/ssh/sshd_config里加一行PasswordAuthentication yes然后systemctl restart sshd。但根子是 shadow 里的哈希格式最稳妥的办法是让用户设置一次新密码让系统按 sha512 重新生成哈希。这个坑不踩一次根本想不到我当时排查了两个小时最后是拿awk -F: $2 ~ /^\$1\$/ /etc/shadow扫出来的。5.4 现象sshd 能起来但端口监听在 IPv6 的:::22远程连不上原因有可能 sshd 启动时只绑定到 IPv6 的 wildcard而客户端用 IPv4 访问或者反过来。这多半是sshd_config里ListenAddress配置缺失或系统模板里带了ListenAddress ::。解决确认sshd_config里写的是ListenAddress 0.0.0.0然后重启。如果还有问题执行ss -tlnp | grep sshd看实际监听地址比对一下吧。这个问题并不总是配置导致的有时是 systemd 里 socket 激活机制在作怪sshd.socket和sshd.service同时启用时端口管理会乱套执行systemctl stop sshd.socket关闭 socket 单元就能恢复。5.5 现象升级后 root 登录被拒但用普通用户能登原因这个十有八九是sshd_config里的PermitRootLogin被重置了。OpenSSH 新版本对PermitRootLogin的默认值更严格而你在打包、安装时把原来的配置覆盖掉了默认变成了prohibit-passwordroot 用密码登录自然进不来。解决先查看grep PermitRootLogin /etc/ssh/sshd_config如果注释掉了或者显式prohibit-password按需改成yes或without-password然后重启 sshd。不要图省事一直用 root 密码登录但如果你的环境强制要求至少保证这个配置是主动设置的而不是被动默认值。6. 验证升级效果与后续加固用 ssh -V、弱算法扫描和连接测试确认这次没白折腾6.1 验证 sshd 确实跑的是 9.6p1升级完成后验证版本是最基本的动作但很多人只知道ssh -V。远程连上去执行这几条ssh -V 21 sshd -V 21 rpm -qa | grep opensshssh是客户端sshd是服务端两个-V输出分别对应各自版本。如果sshd -V还显示旧版多半是启动了/usr/local/sbin/sshd或其他路径的旧二进制用which sshd看下实际路径。6.2 用 ssh-audit 脚本扫描算法和配置基线升级到 9.6p1 不只是为了版本数字好看安全基线的意义在于把旧算法和弱密钥交换算法关掉。我习惯在升级后跑一遍 ssh-audit 脚本不用部署额外依赖只要能出结果就能判断python3 ssh-audit.py 127.0.0.1 -p 22重点看输出里带fail的项目比如ssh-rsa签名算法、diffie-hellman-group14-sha1这类老密钥交换算法。如果还开着需要在sshd_config里显式关闭echo KexAlgorithms curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512 /etc/ssh/sshd_config echo MACs hmac-sha2-256,hmac-sha2-512 /etc/ssh/sshd_config systemctl restart sshd参数说明KexAlgorithms这行只保留安全的密钥交换算法MACs只留 SHA-2 系列的 MAC 算法这样安全扫描工具再跑一遍时就不会报弱算法。这里有个注意点配置新增之后务必要先在本地终端测试一遍能登录再断开所有连接不然改了 KexAlgorithms 后你自己的客户端不支持新算法就再也连不上了。我就干过这种事最后是重启到单用户模式改回来的。6.3 做一次连接矩阵测试覆盖不同客户端和认证方式升级打包不是终点真正的验证是让不同场景连接都走一遍。我在交付前会做一个最小化测试列表逐项打勾测试场景预期结果检查命令本地 root 密码登录登录成功ssh -o PreferredAuthenticationspassword root127.0.0.1本地普通用户密码登录登录成功ssh -o PreferredAuthenticationspassword user127.0.0.1公钥认证免密成功ssh -i ~/.ssh/id_rsa userhostSCP 文件传输传输完成且文件 md5 一致scp testfile userhost:/tmp/ md5sumSFTP 会话能列出目录sftp userhost ls这五条过完基本能确认升级不影响日常运维。千万别只测密码登录公钥认证翻车的例子不少我遇到过升级后因为 authorized_keys 文件属主变了导致公钥登录失败排查发现是打包时/root/.ssh的属主被 rpm 安装过程动过改回来就好。6.4 最后的加固把 sshd_config 里的敏感项再筛一遍9.6p1 装都装了顺手把 sshd_config 的几个老底子问题一并修掉省得之后安全扫描又列一大堆问题sed -i s/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/ /etc/ssh/sshd_config sed -i s/#PubkeyAuthentication yes/PubkeyAuthentication yes/ /etc/ssh/sshd_config sed -i s/#MaxAuthTries 6/MaxAuthTries 4/ /etc/ssh/sshd_config systemctl restart sshdSed命令里s是替换指令前面是匹配模式后面是替换文本。PermitRootLogin prohibit-password允许 root 登录但禁止密码认证只允许公钥这个设置兼顾了审计要求和本机维护便利性。MaxAuthTries 4限制最大认证尝试次数为 4 次防止暴力破解。改完之后拿ssh -G验证一下生效的配置ssh -G 127.0.0.1 | grep -E ^(maxauthtries|pubkeyauthentication|permitrootlogin)-G会在不连接的情况下直接打印实际生效的配置值比打开配置文件猜要直观得多。从那以后我每次升级 ssh 都按这条链路强制走一遍备份、编包、装包、验证算法、跑连接测试、检查弱项配置。绝不跳过任何一步因为每跳过一步后面都有一个夜间排障在等着。这套心得全部沉淀下来就是那台机器上的一份自编译 rpm 安装包及其完整构建流程按我上面给的 spec 和命令你也能在 UOS aarch64 上打出同样干净的 9.6p1 包。希望帮到你。本文还有配套的精品资源点击获取