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

devtools/2025/2/4 23:36:28/

引言

在 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/devtools/156121.html

相关文章

matlab中,fill命令用法

在 MATLAB 中&#xff0c;fill 命令用于创建填充多边形的图形对象。使用 fill 可以在二维坐标系中绘制填充的区域&#xff0c;通常用于绘制图形的背景或显示数据分布。 基本语法 fill(X, Y, C)X 和 Y 是同样长度的向量&#xff0c;定义了多边形的顶点坐标。C 是颜色&#xff0…

FreeRTOS学习笔记2:FreeRTOS的基础知识

1.FreeRTOS介绍 FreeRTOS是一个免费的嵌入式实时操作系统&#xff0c;同时它在市面上也是一款主流的操作系统&#xff0c;是工作上必不可少的技能。它具有以下六种特点&#xff1a; 1.免费开源&#xff1a;在商业产品中使用&#xff0c;无潜在商业风险&#xff0c;无需担心。 2…

2025年01月31日Github流行趋势

项目名称&#xff1a;Qwen2.5项目地址url&#xff1a;https://github.com/QwenLM/Qwen2.5项目语言&#xff1a;Shell历史star数&#xff1a;13199今日star数&#xff1a;459项目维护者&#xff1a;jklj077, JustinLin610, bug-orz, huybery, JianxinMa项目简介&#xff1a;Qwen…

C++中常用的十大排序方法之4——希尔排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之4——希尔排序的相…

w189电商平台的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

Hive:静态分区(分区语法,多级分区,分区的查看修改增加删除)

hive在建表时引入了partition概念。即在建表时&#xff0c;将整个表存储在不同的子目录中&#xff0c;每一个子目录对应一个分区。在查询时&#xff0c;我们就可以指定分区查询&#xff0c;避免了hive做全表扫描&#xff0c;从而提高查询率。 oracle和Hive分区的区别 orcale在…

STM32单片机学习记录(2.2)

一、STM32 13.1 - PWR简介 1. PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能&#xff1b; &#xff08;2&#xff09;可编程电压监测器&#xff08;…

用FormLinker实现自动调整数据格式,批量导入微软表单

每天早上打开Excel时&#xff0c;你是否也经历过这样的噩梦&#xff1f; 熬夜调整好的问卷格式&#xff0c;导入微软表单后全乱套 客户发来的PDF反馈表&#xff0c;手动录入3小时才完成10% 200道题库要转为在线测试&#xff0c;复制粘贴到手指抽筋 微软官方数据显示&#xf…