VPS执行apt update报NO_PUBKEY或EXPKEYSIG怎么办?先定位软件源,别绕过签名

签名错误不是下载慢;trusted=yes、允许不安全仓库和随意导入公钥会把安全检查一起关掉
发布于
7

VPS执行apt update出现NO_PUBKEYEXPKEYSIGThe following signatures were invalid或“仓库没有Release签名”,说明APT无法按当前信任配置验证仓库元数据。它不是普通下载超时,也不应通过关闭签名检查来“修好”。

先找到具体失败的软件源和密钥标识,再检查系统时间、仓库状态与密钥配置。只有确认仓库身份和官方更新方式后,才替换密钥或修改Signed-By。随意从搜索结果导入公钥,可能把错误密钥加入系统信任。

先读懂几类常见报错

提示 通常说明什么 优先检查
NO_PUBKEY 缺少验证当前签名所需的公钥,或软件源没有引用正确keyring 仓库URL、密钥指纹、Signed-By路径
EXPKEYSIG 签名或用于签名的密钥有效性出现问题 系统时间、仓库公告、新密钥与新Release
Release file is not valid yet 本机时间可能落后,或镜像元数据时间异常 时区、NTP和当前UTC时间
repository is not signed 仓库缺少APT可验证的签名信息 URL是否正确、发行版代号、仓库是否已停用
does not have a Release file 路径、发行版版本或仓库结构不匹配 sources配置和仓库支持列表

一条apt update可能同时访问系统官方仓库、Docker、数据库、监控工具和其他第三方源。只要其中一个失败,就应针对那一个源处理,不要删除全部密钥或重写所有源。

第一步:保存完整错误并定位软件源

sudo apt-get update

记录报错中的仓库域名、发行版代号、密钥指纹或ID以及错误类型。再检查当前软件源:

grep -R --line-number -E '^(deb |deb-src |Types:|URIs:|Suites:|Signed-By:)' 
  /etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null

Debian传统单行源通常使用.list,deb822格式通常使用.sources。不要看到同一域名出现多次就立即删除;先判断是否分别提供二进制包、源码包或不同组件。

第二步:检查VPS时间是否可信

date -u
timedatectl status

时间偏差会影响签名和Release文件有效期判断。若时间明显错误,先核对云平台时钟、NTP或chrony状态,再重新运行更新。只为了通过签名检查手工把时间调到任意日期,会让TLS、日志和定时任务出现新的问题。

如果VPS既无法解析仓库域名又报连接错误,应先按VPS DNS解析链与53端口排查恢复名称解析,再判断剩余签名错误。

第三步:确认仓库仍支持当前系统版本

  • 检查系统发行版和代号是否与软件源一致;
  • 查看仓库官方文档是否更换域名、组件或安装方式;
  • 确认旧版本系统是否已经停止提供该仓库;
  • 检查代理、缓存镜像或企业内网镜像是否仍同步最新Release;
  • 不要把另一个Ubuntu或Debian版本的源直接套到当前系统。

若只有第三方仓库失败,可以先在维护窗口暂时禁用该源并重新更新系统官方仓库,但这不等于问题已经修复。依赖该仓库的软件将暂时无法获得更新,应记录并安排后续处理。

第四步:按官方渠道更新专用keyring

apt-key已经弃用。对第三方仓库,更清晰的做法是将经过核对的仓库公钥保存在专用keyring中,并让该软件源通过Signed-By只信任这一组密钥。

sudo install -m 0755 -d /etc/apt/keyrings
ls -l /etc/apt/keyrings /usr/share/keyrings

具体密钥下载地址、文件格式和指纹必须以仓库当前官方文档为准。获取密钥时使用可信通信渠道,核对域名、TLS和官方公布的指纹。不要把文章中的示例域名、论坛附件或陌生代码仓库当作密钥来源。

传统.list源通常类似:

deb [signed-by=/etc/apt/keyrings/vendor.gpg] 仓库官方HTTPS地址 stable main

deb822格式通常把路径放在独立字段:

Types: deb
URIs: 仓库官方HTTPS地址
Suites: stable
Components: main
Signed-By: /etc/apt/keyrings/vendor.gpg

以上只说明结构,不是可直接使用的软件源。Signed-By的价值是限制某个仓库使用指定密钥验证,避免把所有第三方密钥放进全局信任范围。

不要用这些方式掩盖问题

  • 为互联网仓库添加trusted=yes
  • 设置allow-insecure=yes或全局允许不安全仓库;
  • 长期使用--allow-unauthenticated安装软件包;
  • 从未知钥匙服务器按短ID盲目导入密钥;
  • 把第三方密钥加入全局trusted.gpg而不限制仓库;
  • 删除全部keyring后反复尝试更新。

APT的Release签名用于确认仓库元数据没有被不持有签名密钥的人修改。绕过认证可能让更新“继续运行”,却失去判断包索引是否可信的基础。

修复后怎样验收

  1. 重新运行sudo apt-get update并保存完整输出;
  2. 确认原仓库不再出现NO_PUBKEY、EXPKEYSIG或未签名警告;
  3. 检查没有因编辑错误而忽略其他.list.sources文件;
  4. 确认keyring文件可被_apt读取,Signed-By路径正确;
  5. 使用apt-cache policy核对候选包来自预期仓库;
  6. 保留旧配置备份和变更记录,出现异常时可回滚。

如果问题实际是下载超时、代理或连接速度,而签名验证已经正常,应转到npm、pip与APT网络代理配置处理连接路径,不要继续修改密钥。

结论

VPS的APT签名错误应按“失败仓库、系统时间、版本支持、官方密钥、Signed-By、更新复验”处理。NO_PUBKEY不是让用户关闭验证的提示,EXPKEYSIG也不能只靠重新导入任意密钥解决。确认仓库身份并缩小信任范围,才是比绕过签名更安全、可维护的修复。

常见问题(FAQ)

NO_PUBKEY表示什么?
它通常表示APT无法在当前允许的密钥范围内找到验证该仓库签名所需的公钥。应先确认是哪一个仓库报错,再从仓库官方可信渠道获取并核对正确密钥。
EXPKEYSIG一定是系统时间不准吗?
不一定。错误可能涉及过期签名、仓库签名密钥或过旧的仓库元数据;系统时间异常也会影响有效期判断。应同时检查时间和仓库官方公告。
可以使用trusted=yes或allow-insecure绕过吗?
不应作为常规修复。这类设置会削弱或跳过仓库认证,使APT无法正常确认Release元数据是否由可信密钥签署。
为什么不推荐继续使用apt-key add?
apt-key已被弃用。第三方仓库更适合把专用密钥放在/etc/apt/keyrings等位置,并在对应软件源中使用Signed-By限制只有该密钥可验证该仓库。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600