在使用 CentOS 7.7 系统时,用户常遇到 `yum update` 报错“GPG key retrieval failed”或“NOKEY”,提示无法验证仓库元数据的 GPG 密钥。该问题通常由于系统时间不准确、`/etc/yum.repos.d/` 中配置的镜像源失效、官方密钥未正确安装或网络限制导致密钥无法下载所致。尤其是在 CentOS 官方停止维护后,原有默认源已不可用,若未及时更换为可靠的第三方镜像(如阿里云、华为云),则极易出现此错误。解决方法包括:校准系统时间、清理 yum 缓存、更换为有效镜像源,并手动导入对应 GPG 公钥(如 `RPM-GPG-KEY-CentOS-7`)。忽视此问题可能导致软件包被篡改的安全风险。
1条回答 默认 最新
IT小魔王 2025-11-04 08:58关注一、问题现象与初步诊断
在使用 CentOS 7.7 系统执行
yum update命令时,用户常遇到如下错误信息:GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7" NOKEY: Public key for package is not installed该报错表明 yum 工具无法获取或验证软件包签名所需的 GPG 公钥。GPG(GNU Privacy Guard)密钥用于确保从仓库下载的 RPM 包未被篡改,是 Linux 软件供应链安全的重要组成部分。
初步判断可能原因包括:
- 系统时间不准确导致证书校验失败
- /etc/yum.repos.d/ 中配置的源已失效(尤其是官方源停止维护后)
- GPG 密钥文件缺失或路径错误
- 网络策略限制无法访问密钥服务器或镜像站
- yum 缓存损坏或元数据过期
二、深入分析:GPG 验证机制与 CentOS 生命周期影响
CentOS 7 的生命周期已于 2024 年 6 月 30 日正式终止,这意味着所有官方仓库(如
mirror.centos.org)不再更新且部分资源已被移除或重定向。原有的默认 repo 配置指向这些已失效地址,导致yum repolist返回空列表或 404 错误。与此同时,RPM 包管理系统依赖 GPG 签名进行完整性校验。每个仓库需在 .repo 文件中指定
gpgkey=指向有效的公钥 URL,例如:gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 http://vault.centos.org/centos/RPM-GPG-KEY-CentOS-7当此 URL 不可达或本地无对应密钥时,即触发“NOKEY”错误。值得注意的是,某些管理员为图方便设置
gpgcheck=0来跳过验证,但这会带来严重的安全风险——攻击者可构造恶意 RPM 包伪装成合法更新。三、系统性排查流程图
graph TD A[yum update 报错 NOKEY/GPG key retrieval failed] --> B{检查系统时间} B -- 时间偏差 > 5分钟 --> C[使用ntpdate或chronyd同步时间] B -- 时间正常 --> D{检查/etc/yum.repos.d/*.repo} D --> E[确认baseurl是否指向已归档站点] E --> F[替换为阿里云、华为云等可用镜像] F --> G[清理yum缓存: yum clean all] G --> H[重新生成元数据: yum makecache] H --> I{尝试导入GPG密钥} I --> J[手动下载RPM-GPG-KEY-CentOS-7] J --> K[rpm --import RPM-GPG-KEY-CentOS-7] K --> L[yum update 测试] L --> M[成功?] M -- 是 --> N[问题解决] M -- 否 --> O[检查防火墙/DNS/代理设置]四、解决方案详述
以下是分步操作指南,适用于生产环境下的修复流程:
- 校准系统时间:
执行命令:
timedatectl status查看当前时区和时间精度。
若偏差较大,运行:
ntpdate -s time.nist.gov或配置 chronyd 服务自动同步。 - 备份并更换 YUM 源配置:
进入/etc/yum.repos.d/目录,重命名原 repo 文件:
mv CentOS-Base.repo CentOS-Base.repo.bak
下载阿里云提供的适配 CentOS 7 的 repo 文件:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo - 手动导入 GPG 密钥:
下载密钥文件:
wget https://www.centos.org/keys/RPM-GPG-KEY-CentOS-7 -P /etc/pki/rpm-gpg/
导入密钥:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 - 清理缓存并重建元数据:
执行以下命令序列:
yum clean all
yum makecache
此步骤将清除旧的 header 和 package 缓存,并从新源拉取最新 metadata。 - 验证修复结果:
运行yum update --assumeno观察是否仍提示 NOKEY 错误。
如无报错,则可执行实际更新。
五、推荐镜像源与密钥管理最佳实践
镜像提供商 Base URL 示例 GPG Key 获取方式 HTTPS 支持 国内访问速度 阿里云 https://mirrors.aliyun.com/centos-vault/7.9.2009/ wget + rpm --import 是 ★★★★★ 华为云 https://mirrors.huaweicloud.com/repository/centos-vault/7/ 同上 是 ★★★★☆ TUNA (清华) https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7/ 同上 是 ★★★★★ 网易 http://mirrors.163.com/centos-vault/7/ 同上 部分支持 ★★★☆☆ 建议将关键系统的 yum 源统一纳入配置管理工具(如 Ansible、SaltStack),实现自动化部署与合规审计。同时定期巡检
/etc/pki/rpm-gpg/下的密钥完整性,防止意外删除。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报