最近在Ubuntu 24.04系统上执行sudo apt update时,不少用户遇到了这样的警告提示:
code复制W: http://archive.ubuntu.com/ubuntu/dists/noble/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
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
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list.d/*.list:1 and /etc/apt/sources.list.d/*.list:2
W: Target Translations (main/i18n/Translation-en_US) is configured multiple times in /etc/apt/sources.list.d/*.list:1 and /etc/apt/sources.list.d/*.list:2
W: Target Translations (main/i18n/Translation-en) is configured multiple times in /etc/apt/sources.list.d/*.list:1 and /etc/apt/sources.list.d/*.list:2
这个问题的核心在于APT包管理系统对GPG密钥管理方式的重大变更。从Ubuntu 20.04开始,系统逐步淘汰了传统的apt-key管理方式,转而采用更安全的signed-by声明方式。Ubuntu 24.04(代号Noble Numbat)作为最新的LTS版本,彻底移除了对旧方法的支持。
重要提示:这不是简单的警告信息,若不及时处理,后续可能导致软件源验证失败,甚至无法安装更新。
传统方式是将所有GPG密钥集中存储在/etc/apt/trusted.gpg文件中。这种方式存在安全隐患:
新方案要求:
/usr/share/keyrings/目录sources.list中通过signed-by明确指定密钥文件以常见的Docker CE源为例,旧配置可能是:
code复制deb [arch=amd64] https://download.docker.com/linux/ubuntu noble stable
新规范要求改为:
code复制deb [arch=amd64 signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu noble stable
对于已通过apt-key添加的密钥,需要手动迁移:
bash复制sudo apt-key list
找到需要迁移的密钥ID(如9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)
导出密钥到新位置:
bash复制sudo apt-key export 0EBFCD88 | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
编辑/etc/apt/sources.list或/etc/apt/sources.list.d/下的对应文件:
bash复制sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
bash复制sudo nano /etc/apt/sources.list
diff复制- deb http://archive.ubuntu.com/ubuntu noble main
+ deb [signed-by=/usr/share/keyrings/ubuntu-archive-keyring.gpg] http://archive.ubuntu.com/ubuntu noble main
对于"configured multiple times"警告:
bash复制grep -r "deb " /etc/apt/sources.list /etc/apt/sources.list.d/
完整操作流程:
bash复制sudo apt-key del 0EBFCD88
bash复制sudo mkdir -p /usr/share/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
bash复制echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list
bash复制wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg
bash复制echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
完成修改后执行:
bash复制sudo apt update
sudo apt upgrade
预期结果:
若遇到"Could not read key from..."错误:
bash复制sudo chmod 644 /usr/share/keyrings/*.gpg
彻底清理旧密钥:
bash复制sudo rm /etc/apt/trusted.gpg
sudo rm /etc/apt/trusted.gpg.d/*
密钥路径包含空格或特殊字符时,使用引号包裹:
code复制deb [signed-by="/usr/share/keyrings/my custom key.gpg"] http://example.com/ubuntu noble main
密钥文件管理规范:
/usr/share/keyrings/[软件名]-keyring.gpg或[软件名].gpg源配置文件管理:
/etc/apt/sources.list/etc/apt/sources.list.d/[名称].list定期维护:
bash复制# 检查无效源
sudo apt update | grep "Failed"
# 清理无用密钥
ls /usr/share/keyrings/ | grep -v -f <(grep -h signed-by /etc/apt/sources.list /etc/apt/sources.list.d/* | cut -d= -f2 | tr -d ']' | sort -u)
这套解决方案不仅适用于Ubuntu 24.04,同样适用于Debian 11及以后版本。我在处理超过50台服务器的升级过程中,发现早期规范化的密钥管理能显著减少后续维护成本。特别是在容器化环境中,建议将正确的源配置直接打包到基础镜像中。