避坑指南:Ubuntu 20.04更新源报错‘E:签名不再生效‘的4种修复方案

📅 发布时间:2026/7/8 13:46:47 👁️ 浏览次数:
避坑指南:Ubuntu 20.04更新源报错‘E:签名不再生效‘的4种修复方案
当Ubuntu 20.04对你“失去信任”深入解析“签名不再生效”的根源与系统级修复策略最近在维护几台Ubuntu 20.04 LTS服务器时我遇到了一个既熟悉又恼人的提示。在执行例行维护命令sudo apt update后终端里赫然出现了E: 仓库... 不再含有 Release 文件。N: 无法安全地用该源进行更新所以默认禁用该源。N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。以及更直接的W: GPG 错误... 下列签名无效KEYEXPIRED 169...或NO_PUBKEY等错误。核心问题往往指向一个关键短语“签名不再生效”。对于依赖稳定更新的生产环境这绝非小事。它意味着你的系统失去了与软件仓库之间的信任纽带轻则无法获取安全补丁重则可能影响整个服务的部署与安全。这篇文章就是为你——系统管理员、运维工程师或任何需要确保Linux服务器长期稳定运行的伙伴——准备的一份深度排障手册。我们将不止于“如何修复”更要探究“为何发生”并提供一套从诊断到根治再到预防的系统性方案。1. 理解信任的基石APT与GPG签名机制探秘在直接动手修复之前花几分钟理解背后的原理能让你在未来面对类似问题时游刃有余。Ubuntu的APT包管理器并非简单地从一个网络地址下载软件它建立在一套完整的安全验证体系之上。简单来说Ubuntu官方及其认可的镜像站如清华源、阿里云源在发布软件包索引文件如Release、InRelease时会使用一个私有的GPG密钥对其进行数字签名。你的Ubuntu系统内预置了对应的公钥环用于验证这些签名。当apt update运行时它会执行以下关键步骤从配置的软件源/etc/apt/sources.list及/etc/apt/sources.list.d/下的文件下载仓库的元数据文件。尝试使用本地存储的GPG公钥来验证这些元数据文件的签名。如果签名验证通过则认为该源可信进而下载包列表。如果签名验证失败即“签名不再生效”APT会拒绝使用该源以保护系统免受篡改或中间人攻击。那么是什么导致了签名验证失败呢主要原因可以归结为以下几类根本原因具体表现与影响常见触发场景GPG密钥过期错误信息中常包含KEYEXPIRED。这是Ubuntu 20.04进入晚期维护后最常见的问题。官方密钥有有效期过期后未自动更新。系统长期未更新或从旧版本升级后密钥环未及时刷新。软件源地址失效或变更错误信息提示“仓库不再含有 Release 文件”。镜像站路径结构调整、某个特定仓库如PPA被维护者移除。使用了陈旧的、已停更的PPA或镜像站URL格式更新。公钥未被正确导入或丢失错误信息包含NO_PUBKEY后跟一长串密钥ID。系统本地缺少验证该仓库所需的公钥。新添加了第三方PPA后未导入其GPG密钥或密钥环文件意外损坏。系统时间严重偏差签名验证依赖于准确的时间。如果系统时间远快或远慢于实际时间会导致将有效签名误判为无效或过期。虚拟机暂停后恢复、硬件时钟电池耗尽、未配置NTP时间同步。注意在开始任何修复操作前强烈建议先备份相关的配置文件例如sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup以及sudo cp -r /etc/apt/sources.list.d/ /etc/apt/sources.list.d.backup/。这是一个良好的运维习惯。2. 诊断先行精准定位“信任破裂”的环节面对报错不要急于尝试搜索到的第一条命令。正确的诊断能让你事半功倍。打开终端让我们一步步缩小问题范围。首先检查系统时间。这是最容易被忽略却可能瞬间解决问题的一步。运行以下命令date查看输出时间是否与当前实际时间可参考你的手机或权威网络时间基本一致。如果偏差超过几分钟特别是偏差数月或数年那么这极可能就是罪魁祸首。修复方法很简单# 安装并配置NTP服务如果尚未安装 sudo apt install ntpdate -y # 同步时间可能需要先修复网络或临时调整 sudo ntpdate -s time.nist.gov # 或者使用 systemd-timesyncd现代Ubuntu默认 sudo timedatectl set-ntp true sudo timedatectl status其次解读具体的错误信息。再次运行sudo apt update但这次我们让它输出更详细的信息并重点关注是哪个源出了问题sudo apt update 21 | grep -E (Err:|W:|GPG 错误|签名无效|NO_PUBKEY|KEYEXPIRED)这条命令会过滤出所有错误和警告行。观察输出关键信息通常在这里如果看到NO_PUBKEY ABCDEF0123456789说明缺失该ID的密钥。如果看到KEYEXPIRED 169...说明某个密钥已过期。如果错误指向某个特定的URL如http://ppa.launchpad.net/some/ppa/ubuntu那么问题就出在这个PPA上。最后检查软件源配置。查看具体的源地址是否仍然有效。可以尝试用curl或wget手动访问错误信息中提到的Release文件地址# 例如假设错误源是 http://us.archive.ubuntu.com/ubuntu/dists/focal/InRelease curl -I http://us.archive.ubuntu.com/ubuntu/dists/focal/InRelease如果返回404 Not Found或连接超时则说明该源地址已失效。如果返回200 OK则问题更可能出在密钥上。3. 修复策略一处理过期与缺失的GPG密钥当诊断指向密钥问题时我们有以下几种武器。对于过期或缺失的官方Ubuntu密钥Ubuntu 20.04 的官方归档密钥确实存在过期问题。修复的核心是更新ubuntu-keyring这个包它包含了所有必需的根密钥。# 首先尝试更新密钥环包本身 sudo apt update --allow-releaseinfo-change sudo apt install --reinstall ubuntu-keyring -y # 如果上述命令仍报错可以尝试从Ubuntu密钥服务器直接获取最新密钥 # 导入Ubuntu归档密钥适用于focal及更早版本 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C提示apt-key命令在较新版本的Debian/Ubuntu中已被标记为弃用但对于Ubuntu 20.04它仍然是可用的。更现代的方法是将密钥直接放入/etc/apt/trusted.gpg.d/目录使用.gpg文件格式。但对于修复现有问题apt-key通常更直接。对于第三方PPA的NO_PUBKEY错误错误信息会明确告诉你缺失的密钥ID例如NO_PUBKEY B46DC71E03FEEB7F。使用以下命令从Ubuntu密钥服务器导入sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys B46DC71E03FEEB7F将B46DC71E03FEEB7F替换为你实际看到的密钥ID。如果密钥服务器连接不畅可以尝试备用方案有时keyserver.ubuntu.com访问不稳定。你可以换用其他密钥服务器如hkp://pgp.mit.edu:80。前往PPA的Launchpad页面如https://launchpad.net/~ondrej/archive/ubuntu/php在“Technical details about this PPA”部分找到“Signing key”的指纹然后通过其他能访问的服务器获取。完成密钥操作后务必再次运行sudo apt update验证错误是否消失。4. 修复策略二更新与修正软件源列表如果问题出在源地址本身或者你想一劳永逸地切换到更快的镜像就需要修改源列表。备份并编辑主源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup.$(date %Y%m%d) sudo nano /etc/apt/sources.list你也可以使用vim或gedit替代nano。将内容替换为可用的镜像源。对于国内用户清华大学TUNA镜像站是一个极佳的选择。以下是适用于Ubuntu 20.04 Focal Fossa的清华源配置# 清华大学 Ubuntu 镜像源 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse # 安全更新源兼顾官方与镜像注释切换 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse # 预发布软件源不建议常规启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse清理与更新PPA源对于/etc/apt/sources.list.d/目录下的第三方PPA源文件你需要逐一判断其必要性。有些PPA可能已经停止维护。你可以注释掉在行首加#或直接删除你认为不再需要的.list文件。# 列出所有PPA源文件 ls -la /etc/apt/sources.list.d/ # 谨慎地移除一个不再需要的PPA源文件例如假设php旧版PPA sudo rm /etc/apt/sources.list.d/ondrej-php-*.list修改完所有源配置后执行更新sudo apt update如果一切顺利你将看到“命中”、“获取”等成功信息不再有错误和警告。5. 修复策略三处理特定仓库或复杂情况有时问题可能混合了密钥和源地址或者涉及一些特殊仓库。案例修复ROSRobot Operating System仓库的签名错误ROS Noetic 是 Ubuntu 20.04 上的一个常见第三方仓库。其修复流程综合了上述方法确保源地址正确使用清华ROS镜像sudo sh -c echo deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu focal main /etc/apt/sources.list.d/ros-latest.list导入ROS仓库的GPG密钥。如果标准密钥服务器失效可以直接从项目仓库下载sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg注意这里将密钥放入了/usr/share/keyrings/目录这是一种更推荐的方式。相应地如果你的源文件如ros-latest.list中使用了signed-by参数需要确保路径匹配。现代写法示例deb [signed-by/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu focal main当所有方法都无效时考虑“核选项”在极少数情况下本地APT状态可能已混乱。你可以尝试清理并重建本地缓存和状态# 清理已下载的包文件不会删除已安装的软件 sudo apt clean # 清理旧的软件包列表缓存 sudo apt autoclean # 删除所有已下载的软件包列表文件强制下次update时重新获取 sudo rm -rf /var/lib/apt/lists/* # 重建软件包列表缓存目录 sudo mkdir -p /var/lib/apt/lists/partial # 最后重新更新 sudo apt update警告sudo rm -rf /var/lib/apt/lists/*会清除所有仓库的包列表缓存下次apt update需要重新下载所有数据耗时较长。仅在确信有必要时使用。6. 构建防御预防“签名不再生效”的最佳实践修复问题固然重要但建立预防机制更能体现运维水平。以下是我在管理多台Ubuntu服务器后总结的几个习惯定期检查与更新系统即使生产环境追求稳定也应规划定期的维护窗口执行sudo apt update sudo apt upgrade。这不仅能获取安全补丁也能让密钥环等组件保持更新。谨慎添加第三方PPA只从可信赖的维护者那里添加PPA。定期审查/etc/apt/sources.list.d/目录移除不再使用或已停止维护的仓库。一个干净的源列表是稳定性的基础。为关键服务器配置本地镜像或代理对于规模较大的环境可以考虑搭建本地APT镜像如使用apt-mirror或设置缓存代理如apt-cacher-ng。这不仅能加速内网部署还能在外部源出现临时问题时提供一个缓冲。监控系统时间确保所有服务器都启用了NTP同步。对于虚拟机检查宿主机的时间同步设置如VMware Tools、VirtualBox Guest Additions中的时间同步功能。文档化与自动化将经过验证的、稳定的软件源配置包括密钥获取方式写入你的系统配置管理脚本如Ansible Playbook、Shell脚本。在新服务器初始化时自动应用确保环境一致性。那次在凌晨处理线上服务器更新失败的经历让我深刻意识到apt update那行简单的命令背后牵连着整个系统的安全信任链。它不只是下载软件列表更是一次次与远方的仓库进行“握手”验证。密钥过期、地址变迁、时间错位任何一环断裂都会让这次握手失败。现在当再看到“签名不再生效”时我已经不再慌张。一套从诊断查时间、看错误、到修复更新密钥、换源、再到预防的清晰流程足以应对绝大多数情况。记住在Linux的世界里错误信息是你的朋友读懂它你就解决了问题的一大半。剩下的就是根据具体情况选择最合适的那把“钥匙”重新为系统打开那扇通往软件世界的大门。