centos上yum签名机制

CentOS(以及基于 RPM 的系统,比如 RHEL、Rocky、Alma 等)里,yum/dnf 的软件包签名检查机制主要是基于 GPG 签名来保证软件包来源可信、未被篡改。


1. 签名检查的原理

  • 每个 RPM 包在构建时,可以用 私钥进行 GPG 签名,签名信息写入 RPM 包头。
  • 用户端(yum/dnf)会用本地存储的 公钥进行验证。
  • 如果签名不合法、包被篡改、或者公钥缺失,安装/更新就会报错。

2. 关键配置点

  1. yum 仓库配置文件(例如 /etc/yum.repos.d/CentOS-Base.repo)里有:

    1
    2
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    • gpgcheck=1 → 启用 GPG 签名检查
    • gpgkey= → 指定 RPM 公钥的存放位置(通常是官方自带的 .repo 文件里会配置)
  2. 全局配置文件 /etc/yum.conf

    1
    2
    [main]
    gpgcheck=1
    • 全局启用 GPG 检查,具体仓库可以覆盖。
  3. 公钥导入

    1
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    公钥必须导入到本地的 RPM keyring (/etc/pki/rpm-gpg/),才能进行验证。


3. 实际检查过程

当执行 yum install xxx 时:

  1. yum 下载 rpm 包。

  2. 提取包头中的签名(SHA256/MD5 哈希 + GPG 签名信息)。

  3. 调用 rpm 底层库,使用已导入的 GPG 公钥进行验证:

    • 公钥 → 解密签名 → 对比哈希。
    • 一致 → 说明包未被篡改且由可信源签名。
    • 不一致 → 报错 Package xxx.rpm is not signedPublic key not installed.

4. 常见问题

  • 缺少公钥
    报错:

    Public key for xxx.rpm is not installed
    

    解决:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-*

  • 包未签名
    报错:

    NOKEY
    Package xxx.rpm is not signed
    

    解决:要么找签过名的包,要么在 .repo 文件里临时关闭 gpgcheck=0(⚠️不安全)。

  • 签名不匹配
    表示包被篡改或签名与公钥不对应,需确认来源。


5. 总结

  • yum 签名检查 = RPM 包签名 (GPG) + yum 仓库配置 (gpgcheck/gpgkey)
  • 默认 CentOS 官方仓库都启用了签名检查,保证软件来源安全。
  • 禁用签名检查虽然能绕过错误,但会带来 供应链攻击风险