如何在 Ubuntu 22.04 上使用 gpg 添加外部源处理 apt-key 和 add-apt-repository 过时问题

介绍

apt-key是一种用于管理APT用于认证包的密钥的用法。 它与"add-apt-resitory"工具密切相关,它利用键服务器将外部寄存器添加到APT安装的可信任源列表中. 然而,使用 " apt-key " 和 " add-apt-resitory " 添加的密钥通过 " apt " 在全球得到信任。 这些密钥并不限于授权它们原本打算用于的单一寄存器. 以这种方式添加的任何密钥均可被用来授权添加任何其他外部存储库,从而引起重要的安全关注.

從 Ubuntu 20.10 開始,使用「apt-key」會發出警告,即將在不久的將來,該工具將會被廢除;同樣地,「add-apt-repository」也將很快被廢除,儘管這些廢除警告並不嚴格防止使用「apt-key」和「add-apt-repository」在 Ubuntu 22.04,但不建議忽略它們。

目前最好的做法是使用gpg代替apt-keyadd-apt-repository,在未来的Ubuntu版本中,它将是唯一的选择。apt-keyadd-apt-repository本身一直作为包装,在背景中呼叫gpg

本教程将概述使用apt-keyadd-apt-repository的替代方案的两种程序,分别。第一,将使用gpg的公共密钥添加一个外部存储库,而不是使用apt-key

前提条件

要完成本教程,你需要一个Ubuntu 22.04 服务器. 请确保根据我们的 Ubuntu 22.04 初始服务器设置指南设置此服务器,具有sudo特权和启用防火墙的非root 用户。

步骤 1 – 识别组件和关键格式

PGP 或 Pretty Good Privacy 是一个专有的加密程序,用于签名、加密和解密文件和目录. PGP 文件是公共密钥文件,在这个过程中用于验证存储库作为适用的来源。 GPG 或 GNU Privacy Guard 是 PGP 的开源替代品. GPG 文件通常是 keyrings,这些文件包含多个密钥。

「gpg」是GPG的命令行工具,可用于授权外部存储库使用「apt」。然而,「gpg」只接受GPG文件。

弹性搜索为密钥转换提供了一个共同的情景,并将作为本节的例子. 您将下载一个 PGP 格式的密钥, 并将其转换为 apt 文件扩展名的相容格式 。 你将用 " 解除武装 " 旗指挥 " gpg " 。 接下来, 您将把寄存器链接添加到软件包源列表中, 同时直接引用您的已转换密钥 。 最后,您将通过安装弹性搜索软件包来验证这一过程.

需要添加具有密钥验证的存储库的项目将始终为您提供一个公共密钥和一个代表其确切位置的存储库URI。

以下是 Elasticsearch 提供的组件:

  • 密钥: https://artifacts.elastic.co/GPG-KEY-elasticsearch * 存储: https://artifacts.elastic.co/packages/7.x/apt stable main

接下来,你必须确定是否给了你一个PGP或GPG文件来工作,你可以通过打开URL以弯曲检查关键文件:

1curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch

这将输出关键文件的内容,该文件以以下为开头:

1[secondary_label Output]
2-----BEGIN PGP PUBLIC KEY BLOCK-----
3. . .

尽管URL中有GPG,但第一行表明这实际上是一个PGP密钥文件. 请注意,因为apt仅接受GPG格式。 最初,apt-key检测到PGP文件并通过在背景中调用gpg自动转换为GPG。 步骤2 将涵盖从PGP转换为GPG的手动转换,以及当转换不需要时该做什么。

步骤 2 — 下载密钥并转换为apt兼容的文件类型

使用gpg方法,您必须在添加到包源列表之前始终下载密钥。 以前使用apt-key,这种排序并不总是被执行。 现在,您需要在您的源列表中引用下载密钥文件的路径。 如果您没有下载密钥,您显然不能引用现有路径。

使用 Elasticsearch 您正在使用 PGP 文件,所以下载后将其转换为 GPG 文件格式。下面的示例使用curl来下载密钥,下载被导入gpg命令。

在Ubuntu上,‘/usr/share/keyrings’目录是您转换的GPG文件的推荐位置,因为它是Ubuntu存储其密钥的默认位置。

1curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg

这将 PGP 文件转换为正确的 GPG 格式,使其准备好添加到源列表中,以便为 apt

注意:如果下载的文件已经在 GPG 格式中,您可以直接下载到 /usr/share/keyrings,而不使用以下示例的命令进行转换:

1curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg

在这种情况下,‘curl’命令的输出将被导入‘tee’以将文件保存到正确的位置。

步骤 3 – 将仓库添加到您的包源列表中

使用已下载的密钥并使用正确的GPG文件格式,您可以将寄存器添加到"apt"包源中,同时将其与您获得的密钥明确链接. 实现这一点有三种方法,所有这些方法都与apt'如何找到来源有关。 apt'从中央source.list'文件、source.list.d'目录中的source.list.d'文件以及source.list.d'目录中的`source'文件提取来源。 虽然这三种选择在功能上没有区别,但建议考虑这三种选择,选择最适合你需要的方法.

选项 1 — 直接添加到 sources.list

第一种方法是将一个代表源的行直接插入到/etc/apt/sources.list,其中包含apt源的主要文件. 该文件中有多个源,包括与Ubuntu一起提供的默认源。

打开/etc/apt/sources.listnano或您喜爱的文本编辑器:

1sudo nano /etc/apt/sources.list

然后将外部存储库添加到文件的底部:

1[label /etc/apt/sources.list]
2. . .
3deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main

本行包含有关来源的下列信息:

  • `deb': 这指定了源使用正则的Debian架构.
  • arch=amd64,arm64'规定了将下载APT数据的结构。 这是amd64'和`arm64'。
  • 签字人=/用户/股票/钥匙/弹性-7.x.gpg': 此选项指定了用于授权此源的密钥, 并在此指向存储在 /usr/share/ keyrings' 中的您的 `. gpg' 文件 。 这部分线路必须包含在内,而以前在"apt-key"方法中并不需要. 这一增加是远离 " apt-key " 的最关键变化,因为它将钥匙与单一存储处联系起来,允许它授权并纠正 " apt-key " 中原有的安全缺陷。
  • https://artifacts.elastic.co/packages/7.x/apt。 稳定主干线 : 这是代表存储器中数据的确切位置的 URI 。
  • `/etc/apt/source.list.d/弹性-7.x.list': 这是要创建的新文件的位置和名称 。
  • dev/null': 当命令的输出没有必要时使用此功能. 将tee'指向这个地点省略了产出。 .

保存和退出,按CTRL+O,然后按CTRL+X

选项 2 — 在 sources.list.d 中创建一个新的 .list` 文件

使用此选项, 您将在 source. list. d 目录中创建新文件 。 apt'对目录和source.list'进行说明,以补充储存库。 这种方法允许您在单独的文件中物理隔离寄存器添加. 如果您以后需要删除此添加或编辑, 您可以删除此文件, 而不是编辑中心 source. list 文件 。 保持添加内容的分离使维护工作更加容易,而编辑source.list更容易出错,从而影响到文件中的其他寄存器.

要做到这一点,请将一个Echo命令导入一个tee命令,创建这个新文件并插入相应的行. 该文件在下面的示例中被命名为elastic-7.x.list,但只要它是目录中的唯一文件名,任何名称都将工作:

1echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list > /dev/null

此命令与手动创建文件并插入相应的文本行相同。

选项 3 — 在 sources.list.d 中创建一个 .sources` 文件

第三种方法写入一个.sources文件,而不是一个.list文件. 这个方法相对较新的,并使用的deb822多行格式,与deb... 声明相比,不那么模糊,虽然在功能上是相同的。

1sudo nano /etc/apt/sources.list.d/elastic-7.x.sources

然后使用deb822格式添加外部存储库:

1[label /etc/apt/sources.list.d/elastic-7.x.sources]
2Types: deb
3Architectures: amd64 arm64
4Signed-By: /usr/share/keyrings/elastic-7.x.gpg
5URIs: https://artifacts.elastic.co/packages/7.x/apt
6Suites: stable
7Components: main

将文本插入后保存和退出。

这与一行格式类似,并进行线对线比较表明,两者中的信息是相同的,只是有不同的组织。

接下来,您将通过进行测试安装来验证此过程。

步骤 4 — 从外部存储库安装包

您必须拨打apt update以要求apt查看主sources.list文件,以及在sources.list.d中的所有.list.sources文件。

更新您的存储库:

1sudo apt update

然后安装您的包:

1sudo apt install elasticsearch

apt-key方法相比,此步骤没有任何变化.一旦此命令完成,您将完成安装。

Addendum - 使用密钥服务器添加外部存储库

本节将简短地使用gpg与密钥服务器而不是公共密钥来添加外部存储库,该过程几乎与公共密钥方法相同,不同的是如何称为gpg

ad-apt-repository'是apt-key'的以钥匙服务器为基础的对应物,两者都准备贬值。 这种情景使用不同的组件. 而不是一个密钥和寄存器,您会得到一个密钥服务器 URL和密钥 ID 。 在这种情况下,您可以直接从密钥服务器下载到适当的.gpg'格式,而无需转换任何东西。 因为add-apt-resitory'很快会贬值,所以你将使用gpg'下载到文件中,同时压倒默认的gpg'导入到现有密钥环的行为.

使用开源编程语言 R 作为例子,以下是所提供的组件,这些组件也可以在 官方项目网站上的安装说明书中找到:

  • 密钥服务器: keyserver.ubuntu.com * 密钥 ID: E298A3A825C0D65DFD57CBB651716619E084DAB9 * 存储: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

首先,直接从密钥服务器下载使用gpg. 请注意,根据下载流量,此下载命令可能需要一段时间才能完成:

1sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

此命令包含以下旗帜,与使用gpg与公共密钥不同:

  • -不默认-键 ' 与-键 ' 结合,可以输出到一个新的文件,而不是导入到现有的键圈中,这是gpg在这个情景中的默认行为。
  • " 钥匙服务机 " 与 " -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  • -homedir'用于覆盖创建临时文件的gpg'默认位置。 gpg'需要创建这些文件来完成命令,否则gpg'将试图写入造成许可错误的/root'。 相反,这个命令将临时文件放在适当的/tmp'目录中。 .

接下来,将存储库添加到.list 文件中,这是以完全相同的方式进行的,就像通过将一个 echo 命令插入到一个 tee 命令中来使用公共密钥来添加一个外部存储库:

1echo "deb [arch=amd64 signed-by=/usr/share/keyrings/R.gpg] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" | sudo tee /etc/apt/sources.list.d/R.list > /dev/null

接下来,更新您的存储库列表:

1sudo apt update

然后你可以安装该包:

1sudo apt install r-base

使用gpg添加外部存储库在公共密钥和密钥服务器之间是相似的,不同之处在于你如何称呼gpg

结论

使用公共密钥或密钥服务器添加外部存储可以通过gpg进行,而不使用apt-keyadd-apt-repository作为中间工具。 使用此方法确保您的进程不会在未来的Ubuntu版本中过时,因为apt-keyadd-apt-repository被贬值,并将在未来的版本中删除。

Published At
Categories with 技术
comments powered by Disqus