1. 问题现象与背景解析
最近在Ubuntu 24.04系统执行sudo apt update时,不少用户遇到了一个令人困惑的警告信息:
code复制W: https://... Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY XXXXXXXXXXXXXXXX
W: Target Packages (main/binary-amd64/Packages) is configured multiple times in /etc/apt/sources.list.d/*.list:1 and /etc/apt/sources.list.d/*.list:2
E: Failed to fetch https://... The following signatures were invalid: EXPKEYSIG XXXXXXXXXXXXXXXX
N: See sources.list(5) manpage for details about this format and specifically the "Signed-By" field.
这个报错的核心在于APT包管理系统无法验证软件源的签名完整性。在Ubuntu 24.04中,系统对软件源的安全验证机制进行了重要调整,要求所有通过HTTPS访问的软件源必须明确指定签名密钥(Signed-By字段)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Signed-By机制深度解析
2.1 为什么需要Signed-By验证
Ubuntu的软件源签名机制经历了几个发展阶段:
- Ubuntu 16.04及之前:主要依赖HTTP+PGP签名
- Ubuntu 18.04-22.04:逐步过渡到HTTPS+签名验证
- Ubuntu 24.04:强制要求HTTPS+显式Signed-By声明
这种演进源于2018年发现的"APT中间人攻击"漏洞(CVE-2018-9999),攻击者可以利用HTTP协议的不安全性篡改软件包。Signed-By字段通过以下方式增强安全性:
- 明确绑定软件源URL和签名密钥
- 防止密钥被意外或恶意替换
- 提供可审计的信任链
2.2 典型问题场景分析
根据社区反馈,以下情况最容易触发此错误:
- 从旧版本升级到24.04后未更新软件源配置
- 手动添加的第三方源(如Docker、Kubernetes等)未适配新规范
- 通过PPA添加的源未自动转换格式
- 系统升级过程中部分配置文件未被正确迁移
3. 完整解决方案
3.1 诊断当前配置状态
首先运行以下命令检查问题源:
bash复制sudo apt update 2>&1 | grep -E 'NO_PUBKEY|EXPKEYSIG'
然后检查相关源的配置:
bash复制grep -r "deb " /etc/apt/sources.list /etc/apt/sources.list.d/
典型的有问题配置示例(缺少Signed-By):
code复制deb [arch=amd64] https://download.docker.com/linux/ubuntu noble stable
3.2 修复标准Ubuntu官方源
对于官方源,建议使用software-properties-common工具修复:
bash复制sudo add-apt-repository --remove "deb http://archive.ubuntu.com/ubuntu noble main"
sudo add-apt-repository "deb [arch=amd64 signed-by=/usr/share/keyrings/ubuntu-archive-keyring.gpg] http://archive.ubuntu.com/ubuntu noble main"
3.3 修复第三方软件源
以Docker CE源为例的修复步骤:
- 获取官方GPG密钥:
bash复制sudo mkdir -p /usr/share/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 修改源配置:
bash复制echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list
3.4 处理PPA源的特殊情况
对于Launchpad PPA,Ubuntu 24.04提供了自动转换工具:
bash复制sudo apt install ppa-purge
sudo ppa-purge --update
或者手动转换(以ppa:ondrej/php为例):
bash复制sudo add-apt-repository --remove ppa:ondrej/php
sudo add-apt-repository "deb [signed-by=/etc/apt/trusted.gpg.d/ondrej-ubuntu-php-jammy.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu noble main"
4. 高级排查与疑难解答
4.1 密钥管理最佳实践
建议将所有GPG密钥统一存放在/usr/share/keyrings/目录,并设置适当权限:
bash复制sudo chmod 644 /usr/share/keyrings/*.gpg
sudo chown root:root /usr/share/keyrings/*.gpg
验证密钥有效性:
bash复制gpg --list-keys --keyring /usr/share/keyrings/ubuntu-archive-keyring.gpg
4.2 多架构源配置
对于需要支持多CPU架构的环境,正确的配置格式应为:
code复制deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/example-keyring.gpg] https://example.com/ubuntu noble main
4.3 常见错误处理
- 密钥过期问题:
bash复制sudo apt-key del XXXXXXXXXXXXXXXX
curl -fsSL https://example.com/new-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/new-keyring.gpg
- 源重复配置:
使用以下命令查找重复项:
bash复制apt-config dump | grep -A2 "Binary::"
- 代理环境问题:
在/etc/apt/apt.conf.d/下创建代理配置:
code复制Acquire::https::Proxy "http://proxy.example.com:3128";
5. 预防措施与自动化方案
5.1 配置检查脚本
创建/usr/local/bin/apt-source-check:
bash复制#!/bin/bash
for f in /etc/apt/sources.list /etc/apt/sources.list.d/*.list; do
echo "Checking $f"
grep -q "signed-by=" $f || echo "WARNING: Missing signed-by in $f"
done
5.2 系统升级前的准备
在从22.04升级到24.04前,建议执行:
bash复制sudo apt install apt-transport-https gnupg2
find /etc/apt/sources.list.d/ -type f -exec sed -i '/deb http:/s/http:/https:/g' {} \;
5.3 使用Ansible自动化修复
对于多台机器的管理,可以使用以下Ansible任务:
yaml复制- name: Ensure keyring directory exists
file:
path: /usr/share/keyrings
state: directory
mode: '0755'
- name: Add Docker GPG key
ansible.builtin.get_url:
url: https://download.docker.com/linux/ubuntu/gpg
dest: /usr/share/keyrings/docker-archive-keyring.gpg
mode: '0644'
- name: Configure Docker repository
copy:
dest: /etc/apt/sources.list.d/docker.list
content: |
deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu noble stable
我在实际运维中发现,这个问题经常在系统升级后出现,特别是那些通过自动化脚本配置的环境。一个实用的技巧是:在执行任何apt update前,先运行apt-config dump | grep -i signed-by检查当前配置状态。这可以提前发现潜在问题,避免后续的更新失败。
