什么命令(确切地)应该取代弃用的 apt-key?

什么命令(确切地)应该取代弃用的 apt-key?

在新的 ubuntu 20.10 虚拟机上为本地存储库设置密钥时,我收到一条消息,提示 apt-key add 已弃用,我应该阅读apt-key(8) 手册页。apt-key(8) 手册页是串在一起的单词集合,但如果它包含信息,我无法找出来。有人能告诉我,我应该在终端上输入什么,而不是:

apt-key add name-of-file

在向我鸣喇叭之后,该命令显然仍然有效,因此我能够继续,但我想知道将来需要做什么。

答案1

你得知道为什么 apt-key add已弃用

到目前为止,所有答案都围绕着症状(“不要使用apt-key add”),但未能解决实际问题导致apt-key add被弃用。问题不在于将密钥附加到一个大型密钥环文件etc/apt/trusted.gpg还是手动将单密钥密钥环文件放入目录中/etc/apt/trusted.gpg.d/。这两件事是等效的,做任何一件事都会带来巨大的安全风险。

问题是你添加到任何一个以上内容完全且无条件地受到 apt 的信任。这意味着,当从任何存储库(包括官方发行版存储库)安装任何软件包时,apt 都会很乐意接受由以下人员签名的软件包:任何这些受信任密钥的有效性(无论该密钥是否属于软件包来源的存储库)。这削弱了软件包签名机制提供的针对恶意软件包注入官方 Ubuntu 镜像网络的保证。

我们想要做的是将 apt 配置为只接受来自第三方存储库的签名,而不进行交叉签名。Apt 的默认固定规则为官方发行版存储库赋予了更高的优先级,这(与适当的密钥管理相结合)提供了一些保护,防止第三方存储库替换发行版提供的软件包。(至少,我思考这是默认设置。您可以使用它apt-cache policy来检查当前的固定优先级,如果需要,您可以根据它调整固定origin以实现此效果。man apt_preferences有关详细信息,请参阅。)

Ugo Delle Donne 的答案中给出了将密钥转换为 apt 可以接受的 (旧式) 密钥环 v4 格式的说明,这些说明是正确且有用的,但这只是解决方案的一半。我将在这里重申这些说明 (略作整理),以便将所有步骤合并到一个地方:

  • 下载密钥:
    • wget https://host.domain.tld/path/to/<keyfile>.<ext>
      (不需要-O>wget默认将文件保存在当前目录中,并使用与服务器上相同的文件名。)
  • 验证文件类型是否为“PGP 公钥块 Public-Key (old)”:
    • file <keyfile>.<ext>
  • gpg支持多种密钥格式,因此如果您的密钥是不同的格式,请通过将其导入临时密钥环然后再次导出来进行转换:
    • gpg --no-default-keyring --keyring ./temp-keyring.gpg --import <keyfile>.<ext>
    • gpg --no-default-keyring --keyring ./temp-keyring.gpg --export --output <your-keyfile-name>.gpg
    • rm temp-keyring.gpg

现在您已经有了转换后的密钥,不要将其apt复制到 ,以将其添加到 的受信任密钥库中/etc/apt/trusted.gpg.d/。相反,将其放在 之类的某个地方/etc/apt/keyrings/。(您可能需要keyrings先创建该目录。)该位置没有什么特别之处,它只是man 5 sources.listUbuntu 22.04 中推荐的惯例以及相关的Debian 维基入口。

此时,什么都没有改变,apt也不知道密钥的存在。最后一步是修改.list存储库的特定文件,以告诉 apt 在哪里找到密钥那个特定的 repo

  • 编辑文件/etc/apt/sources.list.d/<example>.list,并在deb和 url 之间添加[signed-by=/etc/apt/keyrings/<your-keyfile-name>.gpg]

现在 apt 将接受该密钥对该存储库中所有软件包的签名,并且仅有的那个 repo。

笔记:

  • 如果你已经有密钥环文件/etc/apt/trusted.gpg.d/,你可以复制 移动将它们恢复为/etc/apt/keyrings/原样,然后更新所有相应的.list文件,以便每个文件都有一个signed-by指向其自己的密钥的字段。
  • 如果你的密钥/etc/apt/trusted.gpg环文件中已经有了官方 repo 密钥以外的密钥,这个答案详细说明了找到并删除它们的步骤。然后,您可以按照上述所有相同步骤以更安全的方式设置它们。(也可以从该密钥环中导出它们,但确切步骤留给读者练习。)
  • 导入存储库的密钥来自密钥服务器到独立文件:
    • gpg --no-default-keyring --keyring <output-file-name>.gpg --keyserver <some.keyserver.uri> --recv-keys <fingerprint>
    • 这将为您提供一个 apt 无需转换即可接受的密钥。
  • Apt 仍然非常值得信任,恶意或受感染的 repo 可以轻松绕过此措施,因为软件包目前可以在其安装脚本中以 root 身份运行任意 shell 代码。不过,关闭一个攻击媒介并没有什么坏处,而且其他方面正在(缓慢地)取得进展。
  • Deb822您也可以选择使用单个.sources文件而不是文件切换到更新、更详细的格式.list。这需要更多工作,但我个人认为结果更易读。

资料来源:

答案2

我偶然遇到了同样的问题,幸运的是,其他一些问题照亮了道路。在我的例子中,我试图将 teamviewer 存储库添加到最近的 Kali Linux,但我被密钥验证阻止了。

我很确定有一个更优雅的方法来做到这一点,但以下步骤帮助我解决了这个问题:

  1. 下载相关密钥

    wget -O - https://download.teamviewer.com/download/linux/signature/TeamViewer2017.asc > ~/teamviewer.key

  2. 验证文件类型

    file ~/teamviewer.key

    它应该是PGP 公钥块 Public-Key(旧)

  3. 创建钥匙圈

    gpg --no-default-keyring --keyring ./teamviewer_keyring.gpg --import teamviewer.key

  4. 该文件仍然不是可以添加到的有效密钥/etc/apt/trusted.gpg.d/因为它是一个密钥环,但我们可以从密钥环中提取密钥

    gpg --no-default-keyring --keyring ./teamviewer_keyring.gpg --export > ./teamviewer.gpg

  5. 此文件是您要移动到受信任密钥文件夹的密钥

    sudo mv ./teamviewer.gpg /etc/apt/trusted.gpg.d/

快乐的sudo apt update!!!

答案3

弃用的原因在于使用apt-key add只会将 gpg 密钥附加到受信任的全局 APT 密钥环。它类似于首选的添加local_repo.list/etc/apt/sources.list.d/而不是使用 的方法add-apt-repository dep /link/to/repo version,后者会将消息附加到全局sources.list文件。

我认为这比使用 .d 文件夹更难理解,但本质上我们想将 gpg 密钥放入独立的密钥环文件中,然后在源列表中指向此密钥环文件。默认密钥环文件位置是/usr/share/keyrings,它可以是 .asc 或 .gpg 文件。我不确定区别,但我知道全局密钥环文件是二进制文件,而不是纯文本。

例如:

使用通用名称有时可能有点难以理解,因此这里有一个安装 mongoDB 的示例:

获取 MongoDB gpg 密钥并将其添加到新的密钥环文件中

curl https://www.mongodb.org/static/pgp/server-4.2.asc | sudo tee -a /usr/share/keyrings/buster-mongodb-org-4_2.asc

为 apt 添加一个源条目,指向这个新的密钥环。

例如,如果您的存储库文件位于/etc/apt/sources.list.d/mongodb-org-4_2.list运行以下命令来添加密钥文件:

echo "deb [signed-by=/usr/share/keyrings/buster-mongodb-org-4_2.asc] https://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4_2.list

从这个新添加的 repo 安装 mongodb

sudo apt install -y mongodb-org

参考

这对我来说还是新的,但我所知道的大部分知识都来自unix SE 中的这个优秀答案

答案4

作为直接的替代方案,将其替换apt-key addgpg --dearmor

curl [KEYURL] | sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/[KEYFILE].gpg

但是,不建议这样做(除了作为 apt-key 的类似方法),因为受信任目录中的所有密钥都是无条件信任的;最好将输出放在(非全局)受信任的目录中(正如其他人建议的那样),并让每个源单独指定要信任的密钥。

相关内容