lee.2m 2025-11-04 03:35 采纳率: 97.6%
浏览 0
已采纳

CentOS 7.7源无法更新,提示GPG密钥错误

在使用 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/代理设置]

    四、解决方案详述

    以下是分步操作指南,适用于生产环境下的修复流程:

    1. 校准系统时间
      执行命令:
      timedatectl status 查看当前时区和时间精度。
      若偏差较大,运行:
      ntpdate -s time.nist.gov 或配置 chronyd 服务自动同步。
    2. 备份并更换 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
    3. 手动导入 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
    4. 清理缓存并重建元数据
      执行以下命令序列:
      yum clean all
      yum makecache
      此步骤将清除旧的 header 和 package 缓存,并从新源拉取最新 metadata。
    5. 验证修复结果
      运行 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/ 下的密钥完整性,防止意外删除。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月5日
  • 创建了问题 11月4日