F45 强制签名校验:三条路径的实际行为
Fedora 45 把 RPM 的默认校验模式改成强制验签(官方 ChangeSet:Enforcing signature checking by default)。「强制」落在哪一层,决定了你的第三方 RPM 会不会突然装不上——同一个未签名包,三条安装路径给出三种结果。
本页的终端输出都是在 F45 上现做 rpmbuild 未签名包后逐一跑出来的,不是转述文档。
先看一眼:这个包到底签没签
Section titled “先看一眼:这个包到底签没签”判断签名状态不需要安装,两条命令就够:
rpm -K utest-1.0-1.noarch.rpmrpm -qpi utest-1.0-1.noarch.rpm | head -8未签名包的 rpm -K 输出是:
/tmp/urpms/noarch/utest-1.0-1.noarch.rpm: digests SIGNATURES NOT OKSIGNATURES NOT OK 就是后面三条路径分歧的起点。
三条路径,三种结果
Section titled “三条路径,三种结果”路径一:rpm -i —— 直接拒绝
Section titled “路径一:rpm -i —— 直接拒绝”sudo rpm -i utest-1.0-1.noarch.rpmpackage utest-1.0-1.noarch does not verify: no signature退出码为 1,包没有被装上(rpm -q utest 报 package utest is not installed)。这是 F45 与 F44 最大的行为差异:F44 的 rpm 6.0.x 会直接装上。
路径二:dnf install ./x.rpm —— 告警放行
Section titled “路径二:dnf install ./x.rpm —— 告警放行”sudo dnf -y install ./utest-1.0-1.noarch.rpm[3/3] Installing utest-0:1.0-1.noarch 100% | 4.3 KiB/s | 268.0 B | 00m00sWarning: skipped OpenPGP checks for 1 package from repository: @commandlineComplete!装上了。注意那句 from repository: @commandline——dnf 把本地文件当成一个临时仓库,这个仓库没有 gpgcheck 约束,所以只告警。
路径三:仓库安装(gpgcheck=1)—— 事务阶段拒绝
Section titled “路径三:仓库安装(gpgcheck=1)—— 事务阶段拒绝”把未签名包放进一个开了 gpgcheck=1 的仓库,再用仓库名安装:
sudo dnf -y install utestRunning transactionTransaction failed: Signature verification failed.OpenPGP check for package "utest-1.0-1.noarch" (.../utest-1.0-1.noarch.rpm)from repo "unsigned-local" has failed: The package is not signed.失败发生在事务阶段:包已经下载到缓存,但拒绝写入系统。
错误信息对照表
Section titled “错误信息对照表”| 你看到的原文 | 路径 | 结果 | 处置 |
|---|---|---|---|
does not verify: no signature | rpm -i | 拒绝 | 加 --nosignature 或改用仓库 |
skipped OpenPGP checks … @commandline | dnf install ./x.rpm | 装上了 | 想强制拦截就别用本地文件路径 |
The package is not signed | dnf 仓库安装 | 拒绝 | 给包签名,或临时关 gpgcheck |
SIGNATURES NOT OK | rpm -K | 仅报告 | 检查来源 |
三条路各有各的放行方式,选错会把风险留在系统里:
# 1) 只对这一次安装放行(rpm 层)sudo rpm -i --nosignature utest-1.0-1.noarch.rpm
# 2) 临时对某个仓库关掉校验(只影响当次命令,不写文件)sudo dnf install --setopt=unsigned-local.gpgcheck=0 utest
# 3) 正路:给包签名后走仓库rpm --addsign utest-1.0-1.noarch.rpm批量签名与自建仓库
Section titled “批量签名与自建仓库”团队里更常见的形态是自建仓库。最小的可复现流程是:
# 生成密钥(一次性)gpg --batch --gen-key <<'EOF'%no-protectionKey-Type: RSAKey-Length: 4096Name-Real: Internal RPM SigningName-Email: [email protected]Expire-Date: 2y%commitEOF
# 导出公钥给客户端,私钥导入 rpmgpg --export -a "Internal RPM Signing" > RPM-GPG-KEY-internalsudo rpm --import RPM-GPG-KEY-internal
# 逐个签名并重建元数据rpm --addsign *.rpmcreaterepo_c .客户端仓库文件里 gpgkey= 指向公钥地址、gpgcheck=1,这样未签名包会在事务阶段被拦住,而不是装完才发现。
升级后验证清单
Section titled “升级后验证清单”按这四步确认自己没被卡住:
rpm -q rpm确认版本是 6.1,不是 6.0.x;rpm -K 你的第三方包.rpm看签名状态;- 用
dnf install ./x.rpm走一遍,确认只是告警; - 用仓库名再走一遍,确认会被拒绝——被拒绝才是预期行为。
- 报错速查 — 签名类报错原文与处置
- Fedora 45:变化、下载与升级入口 — 六项变化总览
- 仓库配置迁到 /usr —
gpgcheck写在哪个文件里 - Fedora 安全更新与公告 — 更新与签名策略
- 升级到 Fedora 45 — 升级后核对
- 官方:Fedora 45 ChangeSet