apt-key 已弃用:使用信任密钥环文件替代
在 Debian/Ubuntu 系统中管理第三方软件源时,许多用户遇到了 apt-key
命令的弃用警告。本文将详细解释这一变化的原因,并提供多种现代化的解决方案。
问题背景
当尝试使用以下传统命令添加 GPG 密钥时:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
系统会显示警告信息:
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
为什么 apt-key 被弃用?
apt-key
被弃用主要是出于安全考虑。当使用 apt-key add
将密钥添加到系统时,该密钥会被无条件信任,可用于验证所有软件源,包括官方源。这意味着如果第三方软件源的密钥被泄露,攻击者可以利用它签名恶意软件包并替换系统中的任何软件包。
现代解决方案
以下是几种推荐的方法来替代已弃用的 apt-key
命令。
方法一:使用专用密钥目录(推荐)
这是当前最安全且被广泛推荐的方法:
# 创建密钥目录(如果不存在)
sudo mkdir -m 0755 -p /etc/apt/keyrings
# 下载并转换密钥
curl -fsSL https://example.com/EXAMPLE.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
# 添加软件源(使用DEB822格式)
echo "Types: deb
URIs: https://example.com/apt
Suites: stable
Components: main
Signed-By: /etc/apt/keyrings/example.gpg" | sudo tee /etc/apt/sources.list.d/example.sources > /dev/null
# 创建密钥目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
# 下载并转换密钥
curl -fsSL https://example.com/EXAMPLE.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
# 添加软件源(传统格式)
echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/apt stable main" | sudo tee /etc/apt/sources.list.d/example.list > /dev/null
方法二:嵌入密钥到源文件
对于 apt 2.3.10 及更高版本(Debian 12/Ubuntu 22.04+),可以将密钥直接嵌入到源文件中:
echo "Types: deb
URIs: https://example.com/apt
Suites: stable
Components: main
Signed-By:
$(wget -O- https://example.com/EXAMPLE.gpg | sed -e 's/^$/./' -e 's/^/ /')" | sudo tee /etc/apt/sources.list.d/example.sources > /dev/null
方法三:GUI 工具辅助
对于桌面用户,可以使用图形界面工具管理软件源:
- 打开"软件和更新"设置
- 切换到"其他软件"标签页
- 找到有问题的软件源并编辑
- 在"附加字段"中添加:
Signed-By: /etc/apt/keyrings/example.gpg
实际操作示例
安装 Kubernetes
sudo mkdir -p /etc/apt/keyrings
sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes.gpg
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/kubernetes.gpg] \
http://apt.kubernetes.io/ kubernetes-xenial main" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
sudo apt-get update
sudo apt-get install kubeadm kubelet kubectl
安装 Yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarn.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
迁移现有密钥
如果您之前使用 apt-key
添加过密钥,建议迁移到新方法:
列出当前存储的密钥:
bashsudo apt-key list
记下要迁移的密钥ID或邮箱地址
导出并转换密钥:
bashsudo apt-key export KEY_ID | sudo gpg --dearmor -o /etc/apt/keyrings/new-key.gpg
更新软件源配置文件,添加
signed-by
指向新密钥删除旧密钥:
bashsudo apt-key del KEY_ID
权限设置
确保密钥文件具有正确的权限:
sudo chmod 644 /etc/apt/keyrings/example.gpg
sudo chmod 644 /etc/apt/sources.list.d/example.sources
注意事项
WARNING
不推荐将密钥添加到 /etc/apt/trusted.gpg.d/
目录,因为这会再次导致全局信任问题,违背了弃用 apt-key
的安全初衷。
TIP
使用 dpkg --print-architecture
可以自动检测系统架构,使脚本在不同架构的设备上更具可移植性。
故障排除
如果遇到问题,可以尝试以下步骤:
- 确认密钥文件路径是否正确
- 检查文件权限是否正确
- 验证密钥格式是否正确(使用
gpg --list-packets /etc/apt/keyrings/example.gpg
) - 确保软件源URL和组件名称正确
总结
apt-key
的弃用是出于安全考虑,推动用户采用更安全的密钥管理方式。通过将密钥与特定软件源关联,而不是全局信任,显著提高了系统的安全性。建议所有用户尽快迁移到新的密钥管理方法,以避免未来的兼容性问题并增强系统安全性。
如需更多信息,可以参考 Debian Wiki 或 man sources.list
手册页。