GPG 校验解决什么问题
软件源的 GPG 校验用发行版私钥对包与元数据签名,客户端用预置公钥验证,确认包从发布至今没有被替换或篡改。gpgcheck=1 是每个 .repo 文件的开关,gpgkey 指向公钥位置;当系统提示 Public key not installed 或 NOKEY 时,正确的做法是导入对应公钥,而不是把校验关掉。
基本信息
| 校验开关 | gpgcheck=1(元数据侧另有 repo_gpgcheck) |
|---|---|
| 公钥位置 | gpgkey=file:///etc/pki/rpm-gpg/... 或 https:// 地址 |
| 导入命令 | rpm --import 公钥文件 |
| 查看已导入 | rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}\t%{SUMMARY}\n' |
| 常见报错 | Public key not installed、NOKEY、GPG key retrieval failed |
| 权限要求 | 导入公钥与改 .repo 需要 root |
典型使用场景
- 首次配置官方源或内网镜像源时导入对应公钥
- 换源后校验报错,排查是公钥缺失还是源站异常
- 内网自建源需要自行签名时,同时配置包签名与元数据签名
- 合规检查确认各仓库 gpgcheck 开关是否都为开启状态
- 公钥轮换(发行版更新签名密钥)后补齐新公钥
导入与排查
导入与排查
ls /etc/pki/rpm-gpg/ # 先看系统自带的官方公钥文件
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-kylin # 导入对应发行版公钥
rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}\t%{SUMMARY}\n' # 列出已导入公钥并确认
rpm -q --checksig /var/cache/dnf/*/packages/*.rpm 2>/dev/null | head # 抽查已下载包的签名
dnf install -y nginx # 再试安装;仍报 NOKEY 时核对 .repo 里 gpgkey 地址来源与开关核查
来源与开关核查
[kylin-base]
name=Kylin Base
baseurl=https://update.example.com/kylin/$basearch
enabled=1
gpgcheck=1 # 校验每个 rpm 包的签名
repo_gpgcheck=0 # 校验仓库元数据签名,自建源未做元数据签名时保持 0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-kylin
# 批量查看各仓库开关是否都开着:
# grep -H -E '^(gpgcheck|gpgkey)' /etc/yum.repos.d/*.repo报错与处置
| 提示 | 含义 | 处置 |
|---|---|---|
| Public key not installed | 本地没有该仓库签名公钥 | 导入仓库对应的 gpgkey 文件 |
| NOKEY | 安装时找不到可用公钥 | 核对 .repo 的 gpgkey 地址是否可达且文件名正确 |
| GPG key retrieval failed | 公钥文件下载失败(网络或路径问题) | 改用 file:// 本地公钥或修好网络 |
| signature verification failed | 包内容与签名不匹配 | 停止安装,重新下载包并核查源站 |
| 未报错但需确认开关 | 校验可能被关掉过 | grep 各 .repo 的 gpgcheck 值,确认没有遗留 0 |
把 gpgcheck 改成 0 能立刻绕过报错,但同时也放弃了防篡改能力:只在完全可控的离线介质场景短期使用,且要在变更记录里写明原因与恢复时间。
包签名与仓库元数据签名是两个独立开关,自建内网源若只签了包没签元数据,应先创建签名密钥对元数据签一次,再用 repo_gpgcheck=1 开启元数据校验。