【Linux】APT 密钥管理:官方推荐的解决方案应对 apt-key 弃用

news2025/1/29 13:51:38

引言

在 Ubuntu 和 Debian 系统中,apt-key 命令用于管理 GPG 密钥,验证来自软件包存储库的包是否合法并且未被篡改。然而,从 Debian 11Ubuntu 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 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 及其作用?

在 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 密钥管理方法比较

CSDN @ 2136
APT 密钥管理
传统方法: 使用 apt-key
下载 GPG 密钥并使用 apt-key 添加
将密钥添加到系统的信任密钥库
弃用警告
官方推荐方法
使用 wget 下载 GPG 密钥
使用 tee 将密钥保存到指定目录
存储到 /etc/apt/trusted.gpg.d/ 目录
使用 Signed-By 选项
APT 2.4 版本及以上
推荐将密钥存储到 `/etc/apt/keyrings/` 目录
支持使用 deb822 格式的 sources.list
允许将密钥直接嵌入源列表中
无需将密钥存储在特定目录
在 sources.list 文件中指定密钥路径
验证源的有效性
删除旧的 apt-key 管理密钥
CSDN @ 2136

图解说明:

  1. APT 密钥管理

    • 管理APT包源的安全性,确保软件包来自可信源。
  2. 传统方法: 使用 apt-key

    • 下载并添加 GPG 密钥:通过 apt-key 下载密钥并添加到系统。
    • 信任密钥库:将密钥添加到系统信任库。
    • 弃用警告apt-key 已被弃用,不再推荐使用。
  3. 推荐方法

    • 使用 wget 下载 GPG 密钥:通过 wget 获取密钥。
    • 使用 tee 保存密钥:保存密钥到系统指定目录。
    • 存储到 /etc/apt/trusted.gpg.d/:密钥存储在此目录。
    • 使用 Signed-By 选项:在源配置中使用 Signed-By 指定密钥。
  4. APT 2.4 版本及更高

    • 推荐存储密钥到 /etc/apt/keyrings/ 目录:新的密钥存储目录。
    • 支持 deb822 格式:使用新的源列表格式。
    • 允许嵌入密钥到源列表:密钥可以直接嵌入在源列表文件中。
    • 无需特定目录存储:无需专门目录来存储密钥。
  5. 验证与删除旧密钥

    • 指定密钥路径:在源列表文件中配置密钥路径。
    • 验证源有效性:确保源的有效性和安全性。
    • 删除旧的 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 官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2283646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

69.在 Vue 3 中使用 OpenLayers 拖拽实现放大区域的效果(DragPan)

引言 在现代 Web 开发中&#xff0c;地图功能已经成为许多应用的重要组成部分。OpenLayers 是一个功能强大的开源地图库&#xff0c;支持多种地图源和交互操作。Vue 3 是一个流行的前端框架&#xff0c;以其响应式数据和组件化开发著称。本文将介绍如何在 Vue 3 中集成 OpenLa…

77,【1】.[CISCN2019 华东南赛区]Web4

有句英文&#xff0c;看看什么意思 好像也可以不看 进入靶场 点击蓝色字体 我勒个豆&#xff0c;百度哇 所以重点应该在url上&#xff0c;属于任意文件读取类型 接下来该判断框架了 常见的web框架如下 一&#xff0c;Python 框架 1.Flask URL 示例 1&#xff1a;http://…

手撕B-树

一、概述 1.历史 B树&#xff08;B-Tree&#xff09;结构是一种高效存储和查询数据的方法&#xff0c;它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database S…

一文简单回顾复习Java基础概念

还是和往常一样&#xff0c;我以提问的方式回顾复习&#xff0c;今天回顾下Java小白入门应该知道的一些基础知识 Java语言有哪些特点呢&#xff1f; Java语言的特点有&#xff1a; 面向对象&#xff0c;主要是封装、继承、多态&#xff1b;平台无关性&#xff0c;“一次编写…

GCC之编译(8)AR打包命令

GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…

2.1.3 第一个工程,点灯!

新建工程 点击菜单栏左上角&#xff0c;新建工程或者选择“文件”-“新建工程”&#xff0c;选择工程类型“标准工程”选择设备类型和编程语言&#xff0c;并指定工程文件名及保存路径&#xff0c;如下图所示&#xff1a; 选择工程类型为“标准工程” 选择主模块机型&#x…

图像处理算法研究的程序框架

目录 1 程序框架简介 2 C#图像读取、显示、保存模块 3 C动态库图像算法模块 4 C#调用C动态库 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 程序框架简介 一个图像处理算法研究的常用程序逻辑框架&#xff0c;如下图所示 在该框架中&#xff0c;将图像处…

计算机工程:解锁未来科技之门!

计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展&#xff0c;计算机技术已经深深渗透到我们生活的方方面面&#xff0c;从医疗、金融到教育&#xff0c;无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业&#xff0c;计算机技术的应用尤为突出。比如&a…

Linux初识——基本指令(2)

本文将继续从上篇末尾讲起&#xff0c;讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move&#xff08;移动&#xff09;的缩写&#xff0c;其功能为&#xff1a;1.剪切文件、目录。2.重命名 先演示下重命名&#xff0c;假设我想把当前目录下的di34改成dir5 那…

单片机-STM32 WIFI模块--ESP8266 (十二)

1.WIFI模块--ESP8266 名字由来&#xff1a; Wi-Fi这个术语被人们普遍误以为是指无线保真&#xff08;Wireless Fidelity&#xff09;&#xff0c;并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词&#xff0c;Wi-Fi还出现在ITAA的一个论文中。…

80,【4】BUUCTF WEB [SUCTF 2018]MultiSQL

53&#xff0c;【3】BUUCTF WEB october 2019 Twice SQLinjection-CSDN博客 上面这个链接是我第一次接触二次注入 这道题也涉及了 对二次注入不熟悉的可以看看 BUUCTF出了点问题&#xff0c;打不开&#xff0c;以下面这两篇wp作为学习对象 [SUCTF 2018]MultiSQL-CSDN博客 …

Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置

Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置 1.Prometheus部署1.2.Prometheus修改默认端口 2.grafana可视化页面部署3.alertmanager部署4.监控配置4.1.主机监控node-exporter4.2.监控mysql数据库mysqld_exporter4.3.监控mongod数据库mongodb_expo…

问题排查 - TC397 CORE2 50MS/100MS任务不运行

1、问题描述 CORE2 的任务运行次数的计数值OsTask_100ms_Core2 - task_cnt[12]、OsTask_50ms_Core2 - task_cnt[16]不在累加&#xff0c;但是其他任务OsAlarm_1ms_Core2、OsAlarm_5ms_Core2、OsAlarm_10ms_Core2、OsAlarm_20ms_Core2 任务计数值累加正常。 如果是任务栈溢出&a…

Spring FatJar写文件到RCE分析

背景 现在生产环境部署 spring boot 项目一般都是将其打包成一个 FatJar&#xff0c;即把所有依赖的第三方 jar 也打包进自身的 app.jar 中&#xff0c;最后以 java -jar app.jar 形式来运行整个项目。 运行时项目的 classpath 包括 app.jar 中的 BOOT-INF/classes 目录和 BO…

百度APP iOS端磁盘优化实践(上)

01 概览 在APP的开发中&#xff0c;磁盘管理已成为不可忽视的部分。随着功能的复杂化和数据量的快速增长&#xff0c;如何高效管理磁盘空间直接关系到用户体验和APP性能。本文将结合磁盘管理的实践经验&#xff0c;详细介绍iOS沙盒环境下的文件存储规范&#xff0c;探讨业务缓…

蓝桥杯之c++入门(一)【第一个c++程序】

目录 前言一、第⼀个C程序1.1 基础程序1.2 main函数1.3 字符串1.4 头文件1.5 cin 和 cout 初识1.6 名字空间1.7 注释 二、四道简单习题&#xff08;点击跳转链接&#xff09;练习1&#xff1a;Hello,World!练习2&#xff1a;打印飞机练习3&#xff1a;第⼆个整数练习4&#xff…

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器简介&#xff1a; 1.list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 2.list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[ ]操作符 &#xff08;二&#xff09;list容器头部和尾部的操作 list对象的默…

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型

摘要&#xff1a;我们推出了Sigma&#xff0c;这是一个专为系统领域设计的高效大型语言模型&#xff0c;其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构&#xff0c;并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询&#xff08;Q&…

InceptionV1_V2

目录 不同大小的感受野去提取特征 经典 Inception 网络的设计思路与运行流程 背景任务&#xff1a;图像分类&#xff08;以 CIFAR-10 数据集为例&#xff09; Inception 网络的设计思路 Inception 网络的运行流程 打个比方 多个损失函数的理解 1. 为什么需要多个损失函数&#…

ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果

前言 ORB-SLAM2源码学习&#xff1a;Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点&#xff0c;但是经过三角化成功的三维点并不一定是有效的&#xff0c;需要筛选才能作为初始化地图点。 …