别再傻傻删源了!Ubuntu 22.04更新Node.js 18.x时,一招搞定NO_PUBKEY签名错误

张开发
2026/6/10 22:42:37 15 分钟阅读
别再傻傻删源了!Ubuntu 22.04更新Node.js 18.x时,一招搞定NO_PUBKEY签名错误
优雅解决Ubuntu 22.04更新Node.js时的NO_PUBKEY签名错误遇到NO_PUBKEY ADFF805033AAE0B5这类签名错误时很多人的第一反应是直接删除软件源文件——这就像用锤子解决精密仪器故障。作为长期维护Ubuntu服务器的开发者我发现更优雅的方案是理解GPG密钥机制并手动修复。下面将分享一套可复用的密钥管理方法论。1. 为什么会出现NO_PUBKEY错误当执行apt update时出现NO_PUBKEY提示本质是APT包管理器在验证软件源签名时无法在本地密钥环中找到对应的公钥。这通常由以下三种情况触发残留的旧PPA之前添加的第三方仓库如Souffle已被移除但其GPG密钥仍留在系统中密钥服务器同步延迟官方仓库更换签名密钥时本地尚未完成同步手动添加源未导入密钥直接编辑sources.list文件但未执行apt-key add以NodeSource安装脚本为例当它检测到系统存在其他仓库的密钥问题时会主动终止执行——这是出于安全考虑的设计而非傻叉逻辑。2. 密钥修复的黄金法则2.1 定位缺失密钥首先从错误信息提取密钥ID错误:4 https://packagecloud.io/souffle-lang/souffle/ubuntu focal InRelease 由于没有公钥无法验证下列签名 NO_PUBKEY ADFF805033AAE0B5这里ADFF805033AAE0B5就是我们需要处理的密钥ID实际使用时替换为你的报错值。2.2 从密钥服务器获取公钥对于Ubuntu 22.04 Jammy推荐使用gpg命令而非已废弃的apt-keysudo gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys ADFF805033AAE0B5 sudo gpg --export --armor ADFF805033AAE0B5 | sudo tee /usr/share/keyrings/adff805033aae0b5.gpg /dev/null关键参数说明--keyserver指定Ubuntu官方密钥服务器--armor输出ASCII格式便于存储/usr/share/keyrings/Ubuntu 22.04推荐的密钥存放路径2.3 验证密钥指纹为确保安全务必验证密钥指纹是否与官方公布的一致gpg --fingerprint ADFF805033AAE0B5典型输出应包含完整的40位指纹pub rsa2048 2021-08-19 [SC] 72EC F46A 56B4 AD39 C907 BBB7 1646 B01B 86E5 0310 uid [ unknown] NodeSource gpgnodesource.com3. 不同Ubuntu版本的密钥管理差异版本密钥管理工具密钥存储路径推荐方法20.04 Focalapt-key/etc/apt/trusted.gpg过渡方案兼容新旧方式22.04 Jammygpg/usr/share/keyrings/仅使用新方式18.04 Bionic混合模式两种路径均可建议迁移到新方式对于Ubuntu 22.04绝对不要使用以下已废弃的命令# 已废弃不要在22.04使用 sudo apt-key adv --keyserver... sudo apt-key add...4. 构建密钥急救工具箱4.1 列出所有已安装密钥查看当前系统信任的密钥sudo apt-key list # 或更清晰的方式 gpg --list-keys --keyring /usr/share/keyrings/*.gpg4.2 删除失效密钥当确认某个密钥不再需要时sudo gpg --delete-keys ADFF805033AAE0B5 sudo rm /usr/share/keyrings/adff805033aae0b5.gpg4.3 常用密钥服务器Ubuntu官方hkp://keyserver.ubuntu.com:80MIThkp://pgp.mit.eduSKS池hkp://pool.sks-keyservers.net5. 永久解决方案正确的源添加姿势以NodeSource为例规范的安装流程应该是# 1. 下载并验证密钥 curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg # 2. 添加带signed-by的源 echo deb [signed-by/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x jammy main | sudo tee /etc/apt/sources.list.d/nodesource.list # 3. 更新 sudo apt update这种方法的优势在于密钥与源文件明确关联删除源时密钥也会被清理符合Ubuntu 22.04的安全规范在维护多台服务器的实践中我总结出一个原则永远知道每个密钥为什么存在。盲目删除源文件可能暂时解决问题但理解GPG机制才能从根本上避免类似问题。下次遇到NO_PUBKEY时不妨把这当作深入了解Linux安全机制的机会。

更多文章