首页/系统/信创系统运维速查/软件源 GPG 签名校验
命令与包管理65 条

软件源 GPG 签名校验

官方源都做 GPG 校验保证包未被篡改:gpgcheck=1 加 gpgkey 指定公钥;导入新源公钥用 rpm --import,报 NOKEY 时才需要处理。

信创系统运维速查系统更新于 2026-10-13

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 开启元数据校验。

易错点

  • 遇到 NOKEY 就把 gpgcheck 关掉,报错消失了但攻击面留下了,正确路径是导入公钥或修正 gpgkey 地址
  • 只配了 gpgcheck 没配 gpgkey,或 gpgkey 用了可达性差的 https 地址,离线内网装机时直接失败
  • 导入公钥时导入了来源不明的密钥文件,等于信任了错误的签名主体,公钥应来自发行版官方渠道或内网可信介质
  • 内网镜像做过二次重签名却没更新客户端公钥,表现为签名校验失败而非公钥缺失,排查方向容易跑偏
  • 混用多个仓库但只给其中一个配了公钥,安装跨仓库依赖时会随机报 NOKEY,需逐个仓库核对开关

数据来源与参考

  • RPM GPG 签名文档
  • dnf 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌