【Linux】解决 apt-key 弃用问题:GPG 直接管理密钥代替 apt-key

ops/2025/2/5 20:40:37/

引言

在 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,主要是出于以下几个安全和管理原因:

  1. 密钥管理混乱apt-key 将所有公钥保存在一个单一的文件 /etc/apt/trusted.gpg 中,这样的做法会导致密钥的管理变得复杂且不够安全。当多个软件源使用同一文件存储密钥时,可能会发生密钥冲突或管理不善的情况。

  2. 无法区分来源:旧的 apt-key 管理方式没有办法清晰地标识和区分不同软件源的密钥,使得更新和撤销某个源的密钥变得困难。

  3. 密钥更新困难:如果需要撤销或更新某个源的密钥,必须手动编辑整个文件,这样既繁琐又容易出错。

  4. 不符合现代安全要求:随着安全性要求的提升,密钥管理需要更加灵活和细粒度,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 密钥

为了增强安全性,推荐通过 curlwget 从软件源提供的链接中获取 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.pubcurl 命令从远程服务器下载指定的 GPG 公钥文件。-s 参数表示静默模式,不显示额外的进度信息。
  • sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/repo-name.gpg --importgpg 命令将下载的公钥导入到指定的密钥环文件 /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-keysapt-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 密钥的基本流程图,帮助您更清晰地理解过渡过程。

CSDN @ 2136
查看现有密钥
是否使用 apt-key
运行 apt-key list
检查 APT 配置文件目录
删除不需要的密钥
将新密钥添加到 APT 配置文件中
设置文件权限
完成
直接添加新的密钥
CSDN @ 2136

此流程图展示了从查看现有密钥到添加新密钥的步骤。

总结

APT 包管理器的普遍使用意味着密钥管理在保障系统安全性中扮演着重要角色。随着 apt-key 的逐步弃用,过渡到基于 GPG 的新密钥管理方法成为当务之急。虽然 apt-key 在较长时间内仍然可用,但为了提升系统的安全性,过早开始适应新方法是明智的选择。本文详细介绍了如何有效地迁移到新的密钥管理方法,包括添加、删除和查看 GPG 密钥的操作,同时提供了直观的指导,帮助用户顺利完成这一过渡,以确保 Linux 系统的稳定性与安全性。



http://www.ppmy.cn/ops/155968.html

相关文章

5.3.1 软件设计的基本任务

文章目录 软件设计解决的问题概要设计基本任务详细设计基本任务 软件设计解决的问题 需求分析解决“做什么”的问题&#xff0c;软件设计解决“如何做”的问题。软件设计分为概要设计、详细设计两块。概要设计是设计软件和数据的总体框架&#xff0c;比详细设计的颗粒度更大。详…

Linux进阶——时间服务器

NTP是网络时间协议&#xff08;network time protocol&#xff09;的简称&#xff08;应用层的协议&#xff09;&#xff0c;通过UDP123端口进行网络时钟同步。 Chrony是一个开源自由的网络时间协议NTP的客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器&#xff08…

掌握Spring MVC异常处理的艺术

在Spring MVC中处理异常&#xff0c;就好比你在家里做饭时遇到了问题&#xff0c;比如切菜切到手了&#xff08;运行时异常&#xff09;&#xff0c;或者发现没盐了&#xff08;预期异常&#xff09;。那么&#xff0c;你该怎么应对这些情况呢&#xff1f;Spring MVC处理异常的…

【PyQt】pyqt小案例实现简易文本编辑器

pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器&#xff0c;使用PyQt5框架构建。以下是代码的主要功能和特点&#xff1a; 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…

【C++篇】哈希表

目录 一&#xff0c;哈希概念 1.1&#xff0c;直接定址法 1.2&#xff0c;哈希冲突 1.3&#xff0c;负载因子 二&#xff0c;哈希函数 2.1&#xff0c;除法散列法 /除留余数法 2.2&#xff0c;乘法散列法 2.3&#xff0c;全域散列法 三&#xff0c;处理哈希冲突 3.1&…

玩转ChatGPT:DeepSeek测评(科研思路梳理)

一、写在前面 DeepSeek-R1出圈了&#xff0c;把OpenAI的o3-mini模型都提前逼上线了&#xff08;还免费使用&#xff09;。 都号称擅长深度推理&#xff0c;那么对于科研牛马的帮助有多大呢&#xff1f; 我连夜试一试。 二、科研思路梳理 有时候我们牛马们做了一堆结果以后&…

【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 图像风格迁移(Image Style Transfer)是一种基于深度学习的计算机视觉技术,通过将一张图像的内容与另一张图像的艺术风格结合,生成一幅具…

Win10安装MySQL、Pycharm连接MySQL,Pycharm中运行Django

一、Windows系统mysql相关操作 1、 检查系统是否安装mysql 按住win r &#xff08;调出运行窗口&#xff09; 输入service.msc&#xff0c;点击【确定】 image.png 打开服务列表-检查是否有mysql服务 &#xff08;compmgmt.msc&#xff09; image.png 2、 Windows安装MySQL …