【Linux】APT 密钥管理:官方推荐的解决方案应对 apt-key 弃用
引言
在 Ubuntu 和 Debian 系统中,apt-key
命令用于管理 GPG 密钥,验证来自软件包存储库的包是否合法并且未被篡改。然而,从 Debian 11 和 Ubuntu 22.04 开始,apt-key
被弃用,并将在未来的版本中完全移除。因此,需要逐步适应新的密钥管理方式,以确保系统的安全性和高效性。本篇博客将详细介绍如何处理 apt-key
的弃用警告,如何使用官方推荐的新方法来管理 GPG 密钥,并对相关命令进行优化和解释。
目录
- 引言
- 一、apt-key 弃用警告解析
- 1.1 发生了什么?
- 1.2 什么是 apt-key 及其作用?
- 1.3 apt-key 被弃用的警告信息
- 1.4 `apt-key` 的使用已不推荐
- 二、替代 `apt-key` 使用方式的推荐方法
- 2.1 `apt-key` 使用的传统方式
- 2.2 推荐的新方法
- 2.2.1 使用 `tee` 命令保存密钥到指定目录
- 2.2.2 ASCII 装甲密钥与二进制 OpenPGP 密钥
- 2.2.3 使用 `Signed-By` 选项
- 2.2.4 使用 `deb822` 格式的 `sources.list`
- 2.3 验证源的有效性
- 2.4 何时使用 `apt-key del`
- 三、优势与新方法的安全性
- 3.1 更加安全
- 3.2 增强的灵活性
- 3.3 更好的兼容性
- 四、图示:APT 密钥管理方法比较
- 五、常见问题解答
- 5.1 使用新方法管理密钥时,如何删除旧的密钥?
- 5.2 为什么不直接将密钥存储到 `/etc/apt/trusted.gpg` 文件中?
- 5.3 APT 2.4 或更高版本的兼容性如何?
- 5.4 如何删除所有使用 `apt-key add` 添加的密钥?
- 总结
- 参考资料
一、apt-key 弃用警告解析
1.1 发生了什么?
在 Ubuntu 22.04 或 Debian 11 及更新版本中,当执行 apt update
或 apt upgrade
等命令时,可能会看到类似如下的警告:
W: https://updates.example.com/desktop/apt/dists/xenial/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
此警告表明,apt-key
命令不再推荐使用,并将逐步淘汰。原因是 apt-key
的传统机制存在一定的安全隐患,同时也不符合现代 Linux 系统对密钥管理的需求。因此,APT 开发团队推荐用户尽早过渡到新的密钥管理方法,以提高系统的安全性和灵活性。
1.2 什么是 apt-key 及其作用?
在 Debian 和 Ubuntu 系统中,apt-key
是用来管理用于验证包管理系统(APT)中软件包签名的 GPG 密钥的工具。APT 使用 GPG 密钥来确保下载的软件包来自可信的源,从而避免包被篡改。apt-key
管理的密钥一般存储在 /etc/apt/trusted.gpg
文件中。
然而,apt-key
已逐渐被标记为“弃用”,意味着将来它将被移除或替代。APT 开发团队决定弃用 apt-key
的原因包括:
- 安全性问题:
apt-key
将所有密钥存储在一个统一的文件中,这种管理方式容易遭受篡改或丢失的风险。 - 灵活性不足:在大规模部署场景下,
apt-key
缺乏足够的灵活性,尤其是在需要管理多个密钥的情况下。 - 新的标准:APT 推荐使用
/etc/apt/trusted.gpg.d/
目录来管理密钥,从而提高安全性和可维护性。
1.3 apt-key 被弃用的警告信息
当继续使用 apt-key
时,系统会给出警告,提示该命令已弃用,并建议用户改用新的密钥管理方式。以下是可能遇到的警告信息:
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
这表明 apt-key
已经不再推荐使用,用户应将密钥存储在 /etc/apt/trusted.gpg.d/
目录中,而不是继续使用 apt-key
。
1.4 apt-key
的使用已不推荐
官方文档明确指出,apt-key
将不再是推荐的密钥管理工具,尤其是在 Debian 11 和 Ubuntu 22.04 版本之后。手册页中的相关描述如下:
apt-key is used to manage the list of keys used by apt to authenticate packages. Packages which have been authenticated using these keys are considered trusted.
Use of apt-key is deprecated, except for the use of apt-key del in maintainer scripts to remove existing keys from the main keyring. If such usage of apt-key is desired, the additional installation of the GNU Privacy Guard suite (packaged in gnupg) is required.
apt-key(8) will last be available in Debian 11 and Ubuntu 22.04.
这段描述强调了 apt-key
的弃用,并且提到仅在某些特定场景下(例如,在维护脚本中删除密钥)还可以使用 apt-key del
命令。
手册页的后续部分中,还详细介绍了如何替代旧的 apt-key
使用方式,特别是在 apt update
时触发的弃用警告部分:
DEPRECATION
Except for using apt-key del in maintainer scripts, the use of apt-key is deprecated. This section shows how to replace the existing use of apt-key.
If your existing use of apt-key add looks like this:
wget -qO- https://myrepo.example/myrepo.asc | sudo apt-key add -
Then you can directly replace this with (though note the recommendation below):
wget -qO- https://myrepo.example/myrepo.asc | sudo tee /etc/apt/trusted.gpg.d/myrepo.asc
Make sure to use the "asc" extension for ASCII armored keys and the "gpg" extension for the binary OpenPGP format (also known as "GPG key public ring"). The binary OpenPGP format works for all apt versions, while the ASCII armored format works for apt version >= 1.4.
Recommended: Instead of placing keys into the /etc/apt/trusted.gpg.d directory, you can place them anywhere on your filesystem by using the Signed-By option in your sources.list and pointing to the filename of the key. See sources.list(5) for details. Since APT 2.4, /etc/apt/keyrings is provided as the recommended location for keys not managed by packages. When using a deb822-style sources.list, and with apt version >= 2.4, the Signed-By option can also be used to include the full ASCII armored keyring directly in the sources.list without an additional file.
二、替代 apt-key
使用方式的推荐方法
2.1 apt-key
使用的传统方式
在 apt-key
被弃用之前,用户通常通过如下命令来下载并添加 GPG 密钥:
wget -qO- https://myrepo.example/myrepo.asc | sudo apt-key add -
这条命令首先使用 wget
从指定 URL 下载 GPG 密钥,然后通过 apt-key add
将密钥添加到系统的信任密钥库中。
2.2 推荐的新方法
2.2.1 使用 tee
命令保存密钥到指定目录
为了替代 apt-key add
,推荐使用 tee
命令将 GPG 密钥直接存储到 /etc/apt/trusted.gpg.d/
目录中,命令如下:
wget -qO- https://myrepo.example/myrepo.asc | sudo tee /etc/apt/trusted.gpg.d/myrepo.asc
在这个命令中,wget
从远程地址下载密钥并传递给 tee
命令,后者将下载的 GPG 密钥存储到 /etc/apt/trusted.gpg.d/
目录中。
扩展说明:
- 文件扩展名:对于 ASCII 装甲格式的密钥,文件扩展名应使用
.asc
,而对于二进制 OpenPGP 格式的密钥,则应使用.gpg
。 - APT 版本要求:如果APT 版本是 1.4 或更高版本,推荐使用
.asc
格式。
2.2.2 ASCII 装甲密钥与二进制 OpenPGP 密钥
- ASCII 装甲格式(.asc):这是一个以 ASCII 字符形式编码的 GPG 密钥,适用于 APT 版本 >= 1.4。
- 二进制 OpenPGP 格式(.gpg):这种格式更适用于所有版本的 APT。
通常,建议使用 ASCII 装甲格式(.asc),因为它在现代版本的 APT 中得到了更好的支持。
2.2.3 使用 Signed-By
选项
推荐的方式是将密钥存放在任何一个目录,并在 sources.list
文件中通过 Signed-By
选项引用该密钥,而不是直接将密钥存储到 /etc/apt/trusted.gpg.d/
目录中。这样的做法不仅增加了灵活性,还提高了安全性。
例如,假设有一个名为 myrepo.asc
的 GPG 密钥文件,可以通过如下方式在 sources.list
文件中指定该密钥:
deb [signed-by=/etc/apt/keyrings/myrepo.asc] https://myrepo.example/ubuntu/ focal main
在这种方法中,signed-by
选项告诉 APT 使用指定路径下的 GPG 密钥来验证该软件源的软件包。
自 APT 2.4 版本起,推荐将密钥存储到 /etc/apt/keyrings/
目录。也可以使用 deb822
格式的 sources.list
,直接在文件中包含完整的 ASCII 装甲密钥。
2.2.4 使用 deb822
格式的 sources.list
APT 从 2.4 版本起,支持使用 deb822
格式的 sources.list
文件。这个格式允许用户将密钥直接嵌入到源列表文件中,Signed-By
选项可以直接引用密钥文件,而无需将其存储在特定目录下。通过这种方式,您可以更加灵活地管理密钥,尤其是在需要避免文件管理复杂性时。
例如,在 sources.list
文件中,您可以直接嵌入 ASCII 装甲格式的公钥:
deb [signed-by=/etc/apt/keyrings/myrepo.asc] https://myrepo.example/ubuntu/ focal main
这样,APT 将使用 myrepo.asc
作为密钥验证软件源。
2.3 验证源的有效性
执行以下命令,检查源是否有效并且没有任何警告或错误:
sudo apt update
如果没有与过时密钥相关的警告或错误,说明密钥配置有效,源可以正常工作。
2.4 何时使用 apt-key del
查看现有的密钥
首先,运行 apt-key list
命令列出当前系统中添加的所有 GPG 密钥:
sudo apt-key list
这将显示所有现有的密钥及其对应的 ID。找到需要替换的密钥,并记下它们的 ID。
使用 apt-key del
删除密钥
尽管 apt-key
已经被废弃,并不推荐在日常操作中使用。但在某些情况下(如维护旧脚本时),仍然可以通过 apt-key del
来删除已经添加的密钥。
如果需要删除一个 GPG 密钥,可以使用以下命令:
sudo apt-key del <key_id>
其中 <key_id>
是您在前面步骤中记下的密钥 ID。
注意事项:
- 这种方法仅适用于删除 GPG 密钥。请避免在日常操作中频繁使用
apt-key
,并尽可能迁移到新的密钥管理方法。 - 自
apt-key
被废弃后,推荐使用其他更安全的密钥管理方式,例如将 GPG 密钥存储在/etc/apt/trusted.gpg.d/
目录下。
三、优势与新方法的安全性
3.1 更加安全
新的方法通过将每个软件源的密钥与其源进行明确关联,避免了共享密钥带来的潜在风险。特别是通过 Signed-By
选项,密钥仅与特定软件源相关联,减少了密钥泄漏和滥用的风险。
3.2 增强的灵活性
新的密钥管理方法提供了更高的灵活性。用户可以轻松地为每个软件源指定独立的密钥文件,而不再受限于 /etc/apt/trusted.gpg.d/
目录。这使得密钥管理变得更加清晰和可维护。
3.3 更好的兼容性
随着 APT 项目的更新,新的密钥管理方式与未来版本的 APT 兼容性更好。采用新的方法,用户可以避免未来版本中出现的兼容性问题。
四、图示:APT 密钥管理方法比较
图解说明:
-
APT 密钥管理
- 管理APT包源的安全性,确保软件包来自可信源。
-
传统方法: 使用 apt-key
- 下载并添加 GPG 密钥:通过
apt-key
下载密钥并添加到系统。 - 信任密钥库:将密钥添加到系统信任库。
- 弃用警告:
apt-key
已被弃用,不再推荐使用。
- 下载并添加 GPG 密钥:通过
-
推荐方法
- 使用 wget 下载 GPG 密钥:通过
wget
获取密钥。 - 使用 tee 保存密钥:保存密钥到系统指定目录。
- 存储到 /etc/apt/trusted.gpg.d/:密钥存储在此目录。
- 使用 Signed-By 选项:在源配置中使用
Signed-By
指定密钥。
- 使用 wget 下载 GPG 密钥:通过
-
APT 2.4 版本及更高
- 推荐存储密钥到
/etc/apt/keyrings/
目录:新的密钥存储目录。 - 支持 deb822 格式:使用新的源列表格式。
- 允许嵌入密钥到源列表:密钥可以直接嵌入在源列表文件中。
- 无需特定目录存储:无需专门目录来存储密钥。
- 推荐存储密钥到
-
验证与删除旧密钥
- 指定密钥路径:在源列表文件中配置密钥路径。
- 验证源有效性:确保源的有效性和安全性。
- 删除旧的 apt-key 密钥:清理已弃用的密钥管理方法。
五、常见问题解答
5.1 使用新方法管理密钥时,如何删除旧的密钥?
如果曾使用过 apt-key
添加过密钥,并且希望移除它们,可以使用 apt-key del
命令,如下所示:
sudo apt-key del <keyid>
这将在系统中删除指定的密钥。删除后,请确保通过新的方法(如 tee
命令或 signed-by
选项)重新配置密钥,以保证系统继续能够验证包的合法性。
5.2 为什么不直接将密钥存储到 /etc/apt/trusted.gpg
文件中?
将密钥存储在 /etc/apt/trusted.gpg
中不再推荐,主要是因为:
- 安全性:将所有密钥放在同一个文件中容易遭受篡改风险,尤其是在多密钥管理的情况下。
- 灵活性:将每个密钥单独存储在
/etc/apt/trusted.gpg.d/
目录下,能够更灵活地管理和更新密钥,并减少单一故障点。 - 符合标准:新的方法符合现代 Linux 系统的密钥管理要求,提供了更高的安全性和可维护性。
5.3 APT 2.4 或更高版本的兼容性如何?
APT 2.4 版本和更高版本引入了 signed-by
选项的增强功能。可以通过在 sources.list
文件中直接指定密钥的路径或文件来管理 GPG 密钥,并不再依赖 /etc/apt/trusted.gpg
文件。这为多密钥管理提供了更多灵活性,同时增强了系统的安全性。
5.4 如何删除所有使用 apt-key add
添加的密钥?
要删除所有通过 apt-key add
添加的密钥,您只需删除 /etc/apt/trusted.gpg
文件:
sudo rm /etc/apt/trusted.gpg
注意事项:
- 删除该文件将移除系统中所有的 GPG 密钥,因此在执行此操作之前,请确保不再需要这些密钥。
- 为了更好地管理密钥,建议使用新的密钥管理方法(如将密钥存储在
/etc/apt/trusted.gpg.d/
目录中)。
总结
随着 APT 2.4 版本的发布,apt-key
已被弃用,用户需迁移至新的密钥管理方法。这一变化是为了提高系统的安全性和灵活性,适应日益复杂的安全需求。在官方推荐的新方法中,用户可以使用 tee
命令将 GPG 密钥保存至 /etc/apt/keyrings/
目录,并通过 Signed-By
选项在 sources.list
文件中指定密钥路径,从而确保软件源的验证更加安全、可维护。
这一过渡不仅符合未来 APT 版本的兼容性需求,还能加强密钥管理的灵活性。虽然迁移过程可能需要一些时间适应,但长远来看,这种新的密钥管理方法将提高系统的安全性,减少潜在的安全风险,并增强对新版本 APT 的支持。因此,尽早采用新方法是非常必要的,以确保系统的稳定性和安全性。
参考资料
- APT 官方文档