【Linux】APT 密钥管理迁移指南:有效解决 apt-key 弃用警告

server/2025/1/23 13:59:46/

引言

随着 Debian 11 和 Ubuntu 22.04 版本的推出,APT 的密钥管理方式发生了重大的变化。apt-key 命令被正式弃用,新的密钥管理机制要求使用 /etc/apt/keyrings//etc/apt/trusted.gpg.d/ 来存储和管理密钥。这一变化对管理员和普通用户来说至关重要,特别是当通过 apt updateapt upgrade 执行系统更新时,可能会遇到关于 apt-key 弃用的警告信息。

本博客将详细讲解如何处理 apt-key 弃用警告,如何迁移到新的密钥管理方法,同时提供具体的命令、步骤和解释,帮助大家更好地理解这一变更。

过渡步骤概览

当您遇到 apt-key 弃用的警告时,通常是因为系统中存在使用 apt-key 添加的密钥。为了应对这种情况,需要进行以下操作:

  1. 确定哪些密钥存储在 /etc/apt/trusted.gpg 文件中
  2. 删除过时的密钥,避免产生警告信息。
  3. 安装并配置替代的密钥,使用新的密钥存储路径 /etc/apt/keyrings//etc/apt/trusted.gpg.d/

目录

  • 引言
  • 一、apt-key 弃用警告解析
    • 1.1 发生了什么?
    • 1.2 为什么要迁移?
    • 1.3 新的密钥管理方式
  • 二、迁移密钥管理的步骤
    • 2.1 查找和删除密钥
      • 2.1.1 查找已存储的密钥
      • 2.1.2 删除不需要的密钥
    • 2.2 获取新的密钥并添加
      • 2.2.1 从官方网站获取 GPG 密钥
      • 2.2.2 使用 `wget` 或 `curl` 下载 GPG 密钥
      • 2.2.3 设置文件权限
    • 2.3 使用 `Signed-By` 选项
    • 2.4 验证密钥是否有效
    • 2.5 完成迁移
  • 三、完整示例:迁移密钥管理密钥
  • 四、迁移流程图
  • 总结

一、apt-key 弃用警告解析

1.1 发生了什么?

在 Ubuntu 22.04 或 Debian 11 中,执行 apt updateapt 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 被弃用的原因主要有以下几点:

  • 安全问题apt-key 将所有密钥存储在单个文件中(如 /etc/apt/trusted.gpg),这使得密钥容易受到篡改或丢失的风险。
  • 缺乏灵活性:它无法细粒度地管理每个软件源的独立密钥,尤其是在需要管理多个源时不够方便。
  • 新的标准:推荐使用/etc/apt/keyrings//etc/apt/trusted.gpg.d/ 目录来管理密钥,增强了安全性和可维护性。

这些问题促使了新的密钥管理方式的出现,它可以提高系统的安全性和灵活性,更好地满足现代化需求。

1.3 新的密钥管理方式

新的密钥管理方法建议将密钥文件存储在 /etc/apt/keyrings//etc/apt/trusted.gpg.d/ 目录,并通过 APT 配置文件中的 Signed-By 选项来指定每个软件源的密钥。这样做有几个优点:

  • 独立管理:每个存储库可以使用单独的密钥,避免了 apt-key 所带来的密钥泄露风险。
  • 增强安全性:通过将密钥存储在专用的目录下,密钥管理变得更加安全,且每个密钥的使用场景更加清晰。
  • 灵活性提升:可以更精细地管理每个软件源的认证,提高密钥管理的灵活性。

二、迁移密钥管理的步骤

2.1 查找和删除密钥

首先,检查当前系统中的所有密钥,并删除不再需要的密钥。

2.1.1 查找已存储的密钥

使用 apt-key list 命令查看系统中存储的所有密钥:

$ sudo apt-key list

此命令会显示当前存储在 /etc/apt/trusted.gpg 文件和 /etc/apt/trusted.gpg.d/ 目录中的所有 GPG 密钥。输出信息包括密钥的 ID、相关的仓库以及该密钥的创建日期等信息。

输出示例:

Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8))./etc/apt/trusted.gpg
--------------------
pub   rsa4096 2025-01-20 [SC]A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32
uid           [ unknown] Example <support@example.com>
sub   rsa4096 2025-01-20 [E]pub   rsa4096 2025-01-20 [SC]A4B6 2D8F 8F54 6B7A 5E88 7F16 24B2 A562 54D6 5F76
uid           [ unknown] Google Inc. (Linux Packages Signing Authority) <linux-packages-keymaster@google.com>
sub   rsa4096 2025-01-20 [S] [expires: 2028-01-19]

这些密钥是用来验证各个软件源包的。可以看到,密钥文件中包含多个软件源的密钥,如 Example 和 Google 等。

2.1.2 删除不需要的密钥

可以使用 apt-key del 命令删除不再需要的 GPG 密钥,指定要删除的密钥标识符(通常是一组四位数的十六进制数字)。例如,删除与 Example 相关的密钥,可以执行以下命令:

sudo apt-key del A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32

请根据实际情况替换命令中的密钥标识符删除不需要的密钥。删除密钥后,相关存储库将无法使用此密钥进行认证。如果仍需访问该存储库,必须为其添加新的密钥。

2.2 获取新的密钥并添加

获取和安装新的 GPG 密钥是确保从外部软件源安装软件包时,保持系统安全的一个重要步骤。密钥的获取方法会根据应用程序的不同而有所不同,取决于具体的应用程序。

以下是详细的操作步骤和示例:

2.2.1 从官方网站获取 GPG 密钥

大多数应用程序会在其官方网站提供用于验证软件包的 GPG 密钥,以便验证软件包的完整性和真实性。可以使用 wgetcurl 命令从应用程序的官方网站下载 GPG 密钥。

2.2.2 使用 wgetcurl 下载 GPG 密钥

首先,假设要安装一个应用程序,比如 MyApp,并且该应用程序提供了 GPG 密钥。可以从其官方网站下载密钥。

使用 wget 下载密钥:

wget -qO - https://myapp.example.com/repo/myapp.gpg | sudo tee /etc/apt/keyrings/myapp.gpg

解释:

  • -qO -wget 将以安静模式下载文件并将其输出到标准输出(即终端)。
  • https://myapp.example.com/repo/myapp.gpg:这是应用程序的 GPG 密钥文件的 URL。
  • sudo tee /etc/apt/keyrings/myapp.gpgtee 命令会将密钥保存到 /etc/apt/keyrings/ 目录中。

使用 curl 下载密钥:

curl -fsSL https://myapp.example.com/repo/myapp.gpg | sudo tee /etc/apt/keyrings/myapp.gpg

解释:

  • -fsSLcurl 的选项,确保下载时不显示进度信息、若失败则不输出错误信息,并且支持 SSL。
  • https://myapp.example.com/repo/myapp.gpg:GPG 密钥文件的 URL。
  • sudo tee /etc/apt/keyrings/myapp.gpg:保存密钥到 /etc/apt/keyrings/ 目录。

2.2.3 设置文件权限

确保密钥文件的权限安全,以防止其他用户篡改密钥。

sudo chown root:root /etc/apt/keyrings/myapp.gpg
sudo chmod 644 /etc/apt/keyrings/myapp.gpg
  • chown root:root:确保密钥文件属于 root 用户和 root 用户组。
  • chmod 644:确保文件具有适当的权限,使得只有 root 用户能够修改,其他用户可以读取。

2.3 使用 Signed-By 选项

为确保每个软件源使用正确的密钥,可以将密钥存放在 /etc/apt/keyrings/ 目录,并通过 Signed-By 选项在 APT 配置文件 /etc/apt/sources.list/etc/apt/sources.list.d/ 文件中指定密钥。这样可以提高密钥管理的精确性和安全性。

例如,假设 MyApp 提供了一个软件源,可以将其添加到 APT 的源列表中并使用 Signed-By 指定密钥:

echo "deb [signed-by=/etc/apt/keyrings/myapp.gpg] https://myapp.example.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/myapp.list

解释:

  • deb [signed-by=/etc/apt/keyrings/myapp.gpg] https://myapp.example.com/debian/ stable main:将 MyApp 的软件源添加到 APT 源列表中,并使用 Signed-By 选项指定 GPG 密钥的路径。
  • deb [signed-by=/etc/apt/keyrings/myapp.gpg]:指定软件源使用 /etc/apt/keyrings/myapp.gpg 作为 GPG 密钥。
  • https://myapp.example.com/debian/ stable main:添加 MyApp 的软件源。

2.4 验证密钥是否有效

要确保密钥已正确配置并生效,可以使用以下命令查看 /etc/apt/keyrings/ 目录下的文件列表:

ls -l /etc/apt/keyrings/

输出应该类似于:

-rw-r--r-- 1 root root 7821 Sep  2 10:55 myapp.gpg

如果看到类似的输出,说明密钥已经正确配置。这些文件代表着不同软件包源的密钥文件。

2.5 完成迁移

完成上述步骤后,可以运行 apt update 命令来检查迁移是否成功。一旦密钥迁移完成,系统将不再显示关于 apt-key 弃用的警告。

sudo apt update

如果一切顺利,更新过程将顺利完成,而不会再显示弃用的警告或错误信息。

三、完整示例:迁移密钥管理密钥

以下示例展示了如何添加 MyApp 软件源并确保其安全性。操作步骤包括下载 GPG 密钥、配置软件源、设置文件权限、并最终安装所需的软件包。

操作步骤概览:

  1. 查找 GPG 密钥:使用 sudo apt-key list 命令查看系统中存储的 GPG 密钥。
  2. 删除不需要的 GPG 密钥:使用 sudo apt-key del 命令删除不需要的密钥。
  3. 下载 GPG 密钥:通过 wgetcurl 命令下载 GPG 密钥。
  4. 存储密钥:将密钥存储到 /etc/apt/keyrings/ 目录。
  5. 设置文件权限:确保密钥文件的权限安全。
  6. 配置 APT 使用密钥:在软件源配置文件中使用 Signed-By 选项指定密钥路径。
  7. 安装软件包:更新软件包列表并安装所需的软件包。

具体步骤:
假设要安装 MyApp,并且该应用程序的 GPG 密钥和软件源都提供了。以下是完整的操作步骤:

  1. 查找系统中已有的 GPG 密钥
sudo apt-key list
  1. 删除不需要的 GPG 密钥

    如果 myapp 密钥的标识符是 A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32,删除命令如下:

    sudo apt-key del A9D4 7D52 12F0 E256 1D84 0C32 A63A 9211 3F6A 6E32
    
  2. 下载 GPG 密钥并保存到 /etc/apt/keyrings/ 目录:

    wget -qO - https://myapp.example.com/repo/myapp.gpg | sudo tee /etc/apt/keyrings/myapp.gpg
    
  3. 设置密钥文件的权限:

    sudo chown root:root /etc/apt/keyrings/myapp.gpg
    sudo chmod 644 /etc/apt/keyrings/myapp.gpg
    
  4. 配置 APT添加软件源并指定 GPG 密钥:

    echo "deb [signed-by=/etc/apt/keyrings/myapp.gpg] https://myapp.example.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/myapp.list
    
  5. 更新软件包列表并安装应用程序:

    sudo apt update
    sudo apt install myapp
    

四、迁移流程图

为了帮助大家更好地理解迁移过程,下面提供了一个流程图,简明扼要地展示了迁移步骤:

CSDN @ 2136
旧的 GPG 密钥存储
删除不必要的旧密钥
获取新的 GPG 密钥
将密钥添加到 APT 配置文件中
验证密钥是否有效
完成迁移, 避免 apt-key 弃用警告
CSDN @ 2136

图解说明

  1. 旧的 GPG 密钥存储:首先,使用 apt-key list 列出当前密钥,确定哪些是过时的或不再需要的。
  2. 删除旧密钥:通过 apt-key del 命令删除不再需要的密钥。
  3. 获取新的 GPG 密钥:根据不同的应用程序或软件源,获取并下载新的 GPG 密钥。
  4. 添加密钥到指定位置:将新的密钥存储到 /etc/apt/trusted.gpg.d/etc/apt/keyrings/ 目录。
  5. 验证密钥有效性:检查密钥是否已正确添加,确保 APT 使用新的密钥进行包验证。
  6. 完成迁移:完成所有步骤后,运行 apt update 检查迁移结果,APT 将不会再显示弃用警告。

总结

通过迁移 apt-key 的密钥管理方式,可以更安全地管理系统的存储库和软件包源,避免将来因 apt-key 被废弃而导致的兼容性问题。通过这篇博客的步骤和示例,应该能够顺利完成密钥的迁移,并确保系统能够继续顺利地进行软件包更新。

对于未来的版本,APT 可能会继续改进密钥管理方式,因此保持系统的更新和对新技术的适应将帮助你保持系统的安全性和稳定性。

在实际操作中,现在可以使用 apt update 而不会遇到与废弃密钥配置相关的警告或错误。需要注意的是,用户应当根据新的要求调整依赖于 apt-key 的旧安装方法,改用将密钥安装到 /etc/apt/trusted.gpg.d//etc/apt/keyrings/ 目录下的方式,并根据需要使用 gpg 来管理密钥。

如果你觉得这篇文章对你有帮助,请留言讨论或分享给更多需要的人!



http://www.ppmy.cn/server/160754.html

相关文章

小盒科技携手体验家,优化智能教育服务体验,打造在线教育新高度

北京小盒科技有限公司&#xff08;简称“小盒科技”&#xff0c;由“作业盒子”更名而来&#xff09;是一家专注于教育科技的公司&#xff0c;致力于利用人工智能、大数据等先进技术&#xff0c;为中小学教育提供创新的解决方案和产品。 近日&#xff0c;「小盒科技」携手体…

STM32学习9---EXIT外部中断(理论)

本文参考江科大和其他博主&#xff0c;侵删&#xff01; 中断系统是管理和执行中断的逻辑结构 &#xff0c;外部中断是产生中断的外设之一。 一、STM32中断 1、中断基本介绍 68个可屏蔽中断通道&#xff08;中断源&#xff09;&#xff0c;包含EXTI外部、TIM定时器、ADC模数…

重学设计模式-单例模式

一、什么是单例模式 单例模式&#xff0c;从字面意思理解&#xff0c;就是保证一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。想象一下&#xff0c;在一个大型游戏中&#xff0c;游戏的配置信息类&#xff0c;整个游戏运行期间只需要一份配置数据就够了…

标签编码和独热编码对线性模型和树模型的影响

本人主页&#xff1a;机器学习司猫白 机器学习专栏&#xff1a;机器学习实战 PyTorch入门专栏&#xff1a;PyTorch入门 深度学习实战&#xff1a;深度学习 ok&#xff0c;话不多说&#xff0c;我们进入正题吧 概述 相信大家在建模中经常会用到标签编码和独热编码&#xff0c;这…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…

“深入浅出”系列之数通篇:(5)TCP的三次握手和四次挥手

TCP&#xff08;传输控制协议&#xff09;的三次握手和四次挥手是TCP连接建立和释放的过程。 一、TCP三次握手 TCP三次握手是为了建立可靠的连接&#xff0c;确保客户端和服务器之间的通信能力。具体过程如下&#xff1a; 第一次握手&#xff1a;客户端向服务器发送一个带有…

AF3 ConditionedTransitionBlock类源码解读

ConditionedTransitionBlock类的核心功能是对输入特征进行非线性变换,并通过条件输入(s)自适应地调整特征的表示。 主要模块包括: 自适应层归一化(ada_ln):用于动态调整特征分布。两组线性变换(hidden_gating_linear 和 hidden_linear):用于构造特征空间中的非线性变…

Spark SQL中的from_json函数详解

Spark SQL中的from_json函数详解 在Spark SQL中&#xff0c;from_json是一个用于解析JSON数据的函数&#xff0c;主要用于将JSON格式的字符串解析为结构化的数据&#xff08;即StructType或其他Spark SQL数据类型&#xff09;。这个函数在处理半结构化数据&#xff08;如JSON日…