跳转到内容
搜索 Fedora 文档

    浏览当前文档目录

    F45 强制签名校验:三条路径的实际行为

    Fedora 45 把 RPM 的默认校验模式改成强制验签(官方 ChangeSet:Enforcing signature checking by default)。「强制」落在哪一层,决定了你的第三方 RPM 会不会突然装不上——同一个未签名包,三条安装路径给出三种结果。

    本页的终端输出都是在 F45 上现做 rpmbuild 未签名包后逐一跑出来的,不是转述文档。

    判断签名状态不需要安装,两条命令就够:

    Terminal window
    rpm -K utest-1.0-1.noarch.rpm
    rpm -qpi utest-1.0-1.noarch.rpm | head -8

    未签名包的 rpm -K 输出是:

    /tmp/urpms/noarch/utest-1.0-1.noarch.rpm: digests SIGNATURES NOT OK

    SIGNATURES NOT OK 就是后面三条路径分歧的起点。

    Terminal window
    sudo rpm -i utest-1.0-1.noarch.rpm
    package 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 —— 告警放行”
    Terminal window
    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 | 00m00s
    Warning: skipped OpenPGP checks for 1 package from repository: @commandline
    Complete!

    装上了。注意那句 from repository: @commandline——dnf 把本地文件当成一个临时仓库,这个仓库没有 gpgcheck 约束,所以只告警。

    路径三:仓库安装(gpgcheck=1)—— 事务阶段拒绝

    Section titled “路径三:仓库安装(gpgcheck=1)—— 事务阶段拒绝”

    把未签名包放进一个开了 gpgcheck=1 的仓库,再用仓库名安装:

    Terminal window
    sudo dnf -y install utest
    Running transaction
    Transaction 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.

    失败发生在事务阶段:包已经下载到缓存,但拒绝写入系统。

    你看到的原文路径结果处置
    does not verify: no signaturerpm -i拒绝加 --nosignature 或改用仓库
    skipped OpenPGP checks … @commandlinednf install ./x.rpm装上了想强制拦截就别用本地文件路径
    The package is not signeddnf 仓库安装拒绝给包签名,或临时关 gpgcheck
    SIGNATURES NOT OKrpm -K仅报告检查来源

    三条路各有各的放行方式,选错会把风险留在系统里:

    Terminal window
    # 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

    团队里更常见的形态是自建仓库。最小的可复现流程是:

    Terminal window
    # 生成密钥(一次性)
    gpg --batch --gen-key <<'EOF'
    %no-protection
    Key-Type: RSA
    Key-Length: 4096
    Name-Real: Internal RPM Signing
    Name-Email: [email protected]
    Expire-Date: 2y
    %commit
    EOF
    # 导出公钥给客户端,私钥导入 rpm
    gpg --export -a "Internal RPM Signing" > RPM-GPG-KEY-internal
    sudo rpm --import RPM-GPG-KEY-internal
    # 逐个签名并重建元数据
    rpm --addsign *.rpm
    createrepo_c .

    客户端仓库文件里 gpgkey= 指向公钥地址、gpgcheck=1,这样未签名包会在事务阶段被拦住,而不是装完才发现。

    按这四步确认自己没被卡住:

    1. rpm -q rpm 确认版本是 6.1,不是 6.0.x;
    2. rpm -K 你的第三方包.rpm 看签名状态;
    3. 用 dnf install ./x.rpm 走一遍,确认只是告警;
    4. 用仓库名再走一遍,确认会被拒绝——被拒绝才是预期行为。