引言
在 Linux 系统,尤其是 Debian 和 Ubuntu 中,APT(Advanced Package Tool)是广泛使用的包管理工具,负责安装、更新和管理系统软件包。历史上,apt-key
命令一直被用来管理 GPG 密钥,验证软件包的合法性和完整性。然而,随着 Linux 系统的安全性需求提升,apt-key
已被标记为弃用,并且将逐步被替换为更加现代和安全的密钥管理方式。新的方法推荐直接使用 GPG 来管理密钥,进一步提高了灵活性和安全性。本文将探讨 apt-key
被弃用的背景,并详细阐述如何解决这一问题,通过 GPG 直接管理密钥,以保证软件包验证过程的安全与完整性。
目录
- 引言
- 一、什么是 apt-key 及其作用
- 1.1 `apt-key` 的工作流程
- 1.1.1 添加软件源
- 1.1.2 下载并验证软件包
- 1.1.3 管理密钥
- 1.2 GPG 密钥的作用
- 二、为什么 apt-key 被弃用?
- 三、apt-key 已弃用的警告信息
- 四、如何以新的方式管理 GPG 密钥
- 4.1 使用新方法添加 GPG 密钥
- 4.1.1 远程添加 GPG 密钥
- 4.1.2 本地添加 GPG 密钥
- 4.2 从 GPG 密钥服务器获取密钥
- 4.3 查看已安装的 GPG 密钥
- 4.4 删除 GPG 密钥
- 4.5 权限管理
- 五、如何过渡到新的密钥管理方法
- 步骤 1:查看现有的密钥
- 步骤 2:删除旧的密钥
- 步骤 3:添加新的密钥
- 步骤 4:确保密钥的权限正确
- 六、密钥管理流程图
- 总结
一、什么是 apt-key 及其作用
在 Debian 和 Ubuntu 系统中,apt-key
是用来管理用于验证包管理系统(APT)中软件包签名的 GPG 密钥的工具。APT 使用 GPG 密钥来确保下载的包的来源可靠,从而避免包被篡改。apt-key
管理的密钥可以存储在 /etc/apt/trusted.gpg
文件中。
随着时间的推移,apt-key
命令逐渐被标记为“弃用”,意味着将来会被移除或替代。
1.1 apt-key
的工作流程
1.1.1 添加软件源
当你添加新的软件源时,系统会要求你为该源提供一个公钥,用于验证软件包的签名。没有这个密钥,APT 将无法验证软件包是否可信,从而导致安全风险。软件源的公钥可以从软件发布者获取,通常通过官方网站或某些安全渠道提供。
1.1.2 下载并验证软件包
每次通过 APT 安装或更新软件包时,APT 会检查软件包的签名与存储在本地的密钥是否匹配。如果匹配,软件包就被认为是可信的,并且安装过程继续进行。如果签名不匹配,则会显示警告,甚至拒绝安装该软件包。
1.1.3 管理密钥
apt-key
主要用于管理这些公钥。通过 apt-key
命令,用户可以添加、删除或查看 GPG 密钥。所有密钥都会被保存在 /etc/apt/trusted.gpg
文件中,APT 会从该文件中获取公钥以进行验证。
1.2 GPG 密钥的作用
- 签名验证:每个软件包都有一个 GPG 签名,
apt-key
用于验证这些签名。 - 确保软件包来源可信:通过验证签名,APT 可以确认软件包是否来自预期的软件源。
- 防止软件包篡改:如果软件包的签名无效,APT 会拒绝安装该软件包,避免恶意篡改。
二、为什么 apt-key 被弃用?
随着安全性需求的提高和技术的进步,apt-key
的一些设计缺陷和局限性逐渐暴露出来。为了提供更好的密钥管理,APT 的开发团队决定弃用 apt-key
命令。apt-key
的管理方式过于简单,可能导致密钥管理不够灵活,也难以有效区分不同来源的密钥。因此,为了提高安全性和灵活性,现在推荐使用更现代化的密钥管理方法。
根据官方文档,apt-key
将在 Debian 11 和 Ubuntu 22.04 之后完全弃用。因此,建议用户尽早开始过渡到新方法。
APT 团队决定弃用 apt-key
,主要是出于以下几个安全和管理原因:
-
密钥管理混乱:
apt-key
将所有公钥保存在一个单一的文件/etc/apt/trusted.gpg
中,这样的做法会导致密钥的管理变得复杂且不够安全。当多个软件源使用同一文件存储密钥时,可能会发生密钥冲突或管理不善的情况。 -
无法区分来源:旧的
apt-key
管理方式没有办法清晰地标识和区分不同软件源的密钥,使得更新和撤销某个源的密钥变得困难。 -
密钥更新困难:如果需要撤销或更新某个源的密钥,必须手动编辑整个文件,这样既繁琐又容易出错。
-
不符合现代安全要求:随着安全性要求的提升,密钥管理需要更加灵活和细粒度,
apt-key
不能满足这些需求。新的密钥管理方式通过使用单独的 GPG 密钥文件,能够更好地适应现代的安全标准。
三、apt-key 已弃用的警告信息
在 Debian 10(Buster)和 Ubuntu 20.04 及之后的版本中,apt-key
被逐步弃用。运行 apt update
或其他与包管理相关的命令时,如果系统仍然依赖 apt-key
,用户会看到类似以下的警告信息
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
这表明,APT 已不再推荐使用 apt-key
,而是建议用户使用 /etc/apt/trusted.gpg.d/
目录来存储密钥。这个警告提醒用户要尽早过渡到新的密钥管理方式。
四、如何以新的方式管理 GPG 密钥
APT 采用新的密钥管理机制,将每个软件源的 GPG 公钥存储在 /etc/apt/trusted.gpg.d/
目录下,而不再使用 apt-key
来统一管理所有密钥。这种方式使得密钥管理更加细粒度化,增加了安全性和可维护性。
4.1 使用新方法添加 GPG 密钥
4.1.1 远程添加 GPG 密钥
为了增强安全性,推荐通过 curl
或 wget
从软件源提供的链接中获取 GPG 公钥,并导入到 APT 密钥环中。示例操作步骤如下:
curl -s https://example.com/repo/key.pub | sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/repo-name.gpg --import
curl -s https://example.com/repo/key.pub
:curl
命令从远程服务器下载指定的 GPG 公钥文件。-s
参数表示静默模式,不显示额外的进度信息。sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/repo-name.gpg --import
:gpg
命令将下载的公钥导入到指定的密钥环文件/etc/apt/trusted.gpg.d/repo-name.gpg
。此路径确保密钥被正确地存储并可用于验证相应的源。--no-default-keyring
:避免使用默认的密钥环,而是指定一个新的密钥环文件(即你所指定的文件)。--keyring /etc/apt/trusted.gpg.d/repo-name.gpg
:为每个软件源创建一个独立的密钥文件。--import
:导入公钥。
导入公钥后,你应该设置合适的权限来确保密钥文件的安全性:
sudo chmod 644 /etc/apt/trusted.gpg.d/repo-name.gpg
chmod 644
:确保文件权限为644
,即所有用户可以读取,但只有管理员(root 用户)可以修改文件内容。
4.1.2 本地添加 GPG 密钥
如果你已经从某个地方下载了 GPG 密钥文件,可以直接将它导入到 APT 中。使用如下命令:
cat /path/to/keyfile.pub | sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/repo-name.gpg --import
cat /path/to/keyfile.pub
:读取本地的公钥文件。|
:将文件内容传输给gpg
命令进行处理。- 其他部分与之前相同,将密钥导入到指定的密钥环文件中。
导入公钥后,你应该设置合适的权限来确保密钥文件的安全性:
sudo chmod 644 /etc/apt/trusted.gpg.d/repo-name.gpg
chmod 644
:确保文件权限为644
,即所有用户可以读取,但只有管理员(root 用户)可以修改文件内容。
4.2 从 GPG 密钥服务器获取密钥
有时候,你可能需要从 GPG 密钥服务器(例如 Ubuntu 密钥服务器)获取密钥,这时可以使用以下命令:
sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/repo-name.gpg --keyserver keyserver.ubuntu.com --recv 6B73A36E6026DFCA
--keyserver keyserver.ubuntu.com
:指定从哪个密钥服务器下载公钥。你可以根据实际需要选择其他密钥服务器。--recv 6B73A36E6026DFCA
:接收并导入密钥,6B73A36E6026DFCA
是要导入的密钥的指纹。你需要根据提供源的要求指定正确的密钥 ID 或指纹。
导入密钥后,同样需要设置文件权限:
sudo chmod 644 /etc/apt/trusted.gpg.d/repo-name.gpg
4.3 查看已安装的 GPG 密钥
要查看系统中已导入的 GPG 密钥,你可以使用以下命令:
gpg --list-keys --keyring /etc/apt/trusted.gpg.d/repo-name.gpg
- 这会显示特定密钥文件中的所有公钥信息,包括密钥 ID、指纹等。
如果你希望查看所有系统中安装的 GPG 密钥,可以使用 apt-key
命令:
sudo apt-key list
此命令将列出所有在 APT 中使用的密钥,包括通过 /etc/apt/trusted.gpg
和 /etc/apt/trusted.gpg.d/
存储的密钥。虽然 APT 正在逐步弃用 apt-key
,但是此命令仍然可以用于查看传统的密钥管理系统中的密钥。
例如,输出可能类似于:
/etch/apt/trusted.gpg.d/earth.gpg
------------------------------
pub rsa4096 2025-01-20 [SC] [expires: 2028-05-20]A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32
uid [ unknown] Earth Software <support@earth.com>
sub rsa4096 2025-01-20 [E]
详细解析:
- pub:表示这是公钥(Public Key)。
- rsa4096:表示密钥采用 RSA 算法,长度为 4096 位。
- 2025-01-20:表示密钥的创建日期是 2025 年 1 月 20 日。
- [SC]:表示该密钥用于签名(S)和认证(C),即该密钥可以用来验证信息的真实性及其完整性。
- [expires: 2028-05-20]:表示密钥的有效期至 2028 年 5 月 20 日,过期后将无法使用该密钥。
- A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32:是该公钥的唯一标识符(Key ID),可用于引用和识别此密钥。
- uid:表示与该密钥相关的用户标识,
Earth Software <support@earth.com>
是该密钥的持有者及其联系邮箱地址。 - sub:表示该密钥还拥有一个子密钥(Subkey),类型同样为
rsa4096
,用于加密数据(标记为[E]
)。 - 密钥的用途分为
[SC]
和[E]
(SC
表示用于签名和认证,E
表示用于加密)。
4.4 删除 GPG 密钥
删除不再需要的 GPG 密钥,确保系统的安全。你可以直接删除 .gpg
文件:
sudo rm /etc/apt/trusted.gpg.d/repo-name.gpg
如果你是通过 apt-key
添加的密钥,可以通过以下命令删除:
sudo apt-key del KEY_ID
KEY_ID
是你要删除的密钥的 ID。可以通过apt-key list
找到该 ID。
4.5 权限管理
密钥文件的权限非常重要,应该确保密钥文件的权限设置为 644(对所有用户可读,只有 root 用户可写)。这有助于防止非授权用户修改密钥文件:
sudo chmod 644 /etc/apt/trusted.gpg.d/repo-name.gpg
此外,确保 /etc/apt/trusted.gpg.d/
目录本身的权限正确,避免任何非法访问:
sudo chmod 700 /etc/apt/trusted.gpg.d
这会确保只有管理员可以访问该目录。
五、如何过渡到新的密钥管理方法
随着 apt-key
方法的弃用,推荐过渡到新的密钥管理方法以提高安全性。以下是过渡的详细步骤:
步骤 1:查看现有的密钥
首先,运行以下命令查看当前系统中已经添加的密钥:
sudo apt-key list
通过此命令,你可以列出系统中的所有密钥,并识别出需要替换的旧密钥。记下不再需要的密钥 ID。
步骤 2:删除旧的密钥
一旦识别出过时的密钥,使用 apt-key del
删除旧的密钥,或者直接删除相关的 .gpg
文件:
sudo apt-key del KEY_ID
或者,直接删除存储在 /etc/apt/trusted.gpg.d/
目录中的相关 .gpg
文件:
sudo rm /etc/apt/trusted.gpg.d/old-key.gpg
以 A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32
为示例密钥 ID:
sudo apt-key del `A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32`
其中 A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32
是您要删除的密钥 ID。删除后,您将看到类似以下的输出:
OK
这表示密钥已成功从系统中删除。
验证删除
可以使用 gpg --list-keys
或 apt-key list
来验证密钥是否被成功删除。
使用以下命令确认密钥已被删除:
gpg --list-keys --keyring /etc/apt/trusted.gpg.d/earth.gpg
如果文件已被删除,您应该会看到类似下面的输出,表示没有密钥:
/etc/apt/trusted.gpg.d/earth.gpg
------------------------------
gpg: keyblock resource `/etc/apt/trusted.gpg.d/earth.gpg': file open failed: No such file or directory
这表明 earth.gpg
文件以及其中的密钥已经成功删除。
步骤 3:添加新的密钥
在删除旧密钥后,按照以下步骤添加新的 GPG 密钥:
-
从远程 URL 获取密钥:
curl -fsSL https://example.com/repo-public.gpg | sudo tee /etc/apt/trusted.gpg.d/repo-name.gpg
-
或者,从密钥服务器导入:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys KEY_ID
-
或者,从本地文件添加:
sudo cp /path/to/key.gpg /etc/apt/trusted.gpg.d/
确保将新密钥添加到 /etc/apt/trusted.gpg.d/
目录中。
步骤 4:确保密钥的权限正确
为了保证密钥文件的安全性,请检查并设置适当的文件权限:
sudo chmod 644 /etc/apt/trusted.gpg.d/repo-name.gpg
此命令确保文件可以被系统读取,但只有管理员有权修改。
六、密钥管理流程图
以下是添加、删除和管理 GPG 密钥的基本流程图,帮助您更清晰地理解过渡过程。
此流程图展示了从查看现有密钥到添加新密钥的步骤。
总结
APT 包管理器的普遍使用意味着密钥管理在保障系统安全性中扮演着重要角色。随着 apt-key
的逐步弃用,过渡到基于 GPG 的新密钥管理方法成为当务之急。虽然 apt-key
在较长时间内仍然可用,但为了提升系统的安全性,过早开始适应新方法是明智的选择。本文详细介绍了如何有效地迁移到新的密钥管理方法,包括添加、删除和查看 GPG 密钥的操作,同时提供了直观的指导,帮助用户顺利完成这一过渡,以确保 Linux 系统的稳定性与安全性。