Skip to content

apt-key 已弃用:使用信任密钥环文件替代

在 Debian/Ubuntu 系统中管理第三方软件源时,许多用户遇到了 apt-key 命令的弃用警告。本文将详细解释这一变化的原因,并提供多种现代化的解决方案。

问题背景

当尝试使用以下传统命令添加 GPG 密钥时:

bash
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 命令。

方法一:使用专用密钥目录(推荐)

这是当前最安全且被广泛推荐的方法:

bash
# 创建密钥目录(如果不存在)
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
bash
# 创建密钥目录
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+),可以将密钥直接嵌入到源文件中:

bash
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 工具辅助

对于桌面用户,可以使用图形界面工具管理软件源:

  1. 打开"软件和更新"设置
  2. 切换到"其他软件"标签页
  3. 找到有问题的软件源并编辑
  4. 在"附加字段"中添加:Signed-By: /etc/apt/keyrings/example.gpg

实际操作示例

安装 Kubernetes

bash
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

bash
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 添加过密钥,建议迁移到新方法:

  1. 列出当前存储的密钥:

    bash
    sudo apt-key list
  2. 记下要迁移的密钥ID或邮箱地址

  3. 导出并转换密钥:

    bash
    sudo apt-key export KEY_ID | sudo gpg --dearmor -o /etc/apt/keyrings/new-key.gpg
  4. 更新软件源配置文件,添加 signed-by 指向新密钥

  5. 删除旧密钥:

    bash
    sudo apt-key del KEY_ID

权限设置

确保密钥文件具有正确的权限:

bash
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 可以自动检测系统架构,使脚本在不同架构的设备上更具可移植性。

故障排除

如果遇到问题,可以尝试以下步骤:

  1. 确认密钥文件路径是否正确
  2. 检查文件权限是否正确
  3. 验证密钥格式是否正确(使用 gpg --list-packets /etc/apt/keyrings/example.gpg
  4. 确保软件源URL和组件名称正确

总结

apt-key 的弃用是出于安全考虑,推动用户采用更安全的密钥管理方式。通过将密钥与特定软件源关联,而不是全局信任,显著提高了系统的安全性。建议所有用户尽快迁移到新的密钥管理方法,以避免未来的兼容性问题并增强系统安全性。

如需更多信息,可以参考 Debian Wikiman sources.list 手册页。