centos上yum签名机制
CentOS(以及基于 RPM 的系统,比如 RHEL、Rocky、Alma 等)里,yum/dnf 的软件包签名检查机制主要是基于 GPG 签名来保证软件包来源可信、未被篡改。
1. 签名检查的原理
- 每个 RPM 包在构建时,可以用 私钥进行 GPG 签名,签名信息写入 RPM 包头。
- 用户端(yum/dnf)会用本地存储的 公钥进行验证。
- 如果签名不合法、包被篡改、或者公钥缺失,安装/更新就会报错。
2. 关键配置点
yum 仓库配置文件(例如
/etc/yum.repos.d/CentOS-Base.repo)里有:1
2gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7gpgcheck=1→ 启用 GPG 签名检查gpgkey=→ 指定 RPM 公钥的存放位置(通常是官方自带的.repo文件里会配置)
全局配置文件
/etc/yum.conf:1
2[main]
gpgcheck=1- 全局启用 GPG 检查,具体仓库可以覆盖。
公钥导入:
1
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
公钥必须导入到本地的 RPM keyring (
/etc/pki/rpm-gpg/),才能进行验证。
3. 实际检查过程
当执行 yum install xxx 时:
yum 下载 rpm 包。
提取包头中的签名(SHA256/MD5 哈希 + GPG 签名信息)。
调用
rpm底层库,使用已导入的 GPG 公钥进行验证:- 公钥 → 解密签名 → 对比哈希。
- 一致 → 说明包未被篡改且由可信源签名。
- 不一致 → 报错
Package xxx.rpm is not signed或Public 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 官方仓库都启用了签名检查,保证软件来源安全。
- 禁用签名检查虽然能绕过错误,但会带来 供应链攻击风险。