警告:apt-key 已弃用。改为管理 trust.gpg.d 中的密钥环文件

dib*_*ery 143 apt apt-key

我正在按照本指南安装elasticsearch ,但elasticsearch实际上并不是这个问题的一部分。

第一步,我需要添加密钥:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Run Code Online (Sandbox Code Playgroud)

并收到以下消息:

Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
Run Code Online (Sandbox Code Playgroud)

安装过程很好,但由于它已被弃用,我正在寻找替代apt-key. (我安装这个包没有问题。)从man apt-key我看到

apt-key(8) 将最后在 Debian 11 和 Ubuntu 22.04 中可用。

...

因此,要与任何 apt 版本一起使用的二进制密钥环文件应始终使用 gpg --export 创建。

但它没有说 的替代方案apt-key add。我试过

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --export
Run Code Online (Sandbox Code Playgroud)

但没有用。wget那么when的管道apt-key拆掉之后我该怎么用呢?

FWD*_*ker 159

添加密钥/etc/apt/trusted.gpg.d不安全的,因为它添加了所有存储库的密钥。这正是必须apt-key弃用的原因。

简洁版本

与Signal 的操作类似。https://example.com/EXAMPLE.gpg如果您想使用中列出的存储库的密钥/etc/apt/sources.list.d/EXAMPLE.list,请使用:

sudo mkdir -m 0755 -p /etc/apt/keyrings/

wget -O- https://example.com/EXAMPLE.gpg |
    gpg --dearmor |
    sudo tee /etc/apt/keyrings/EXAMPLE.gpg > /dev/null
    sudo chmod 644 /etc/apt/keyrings/EXAMPLE.gpg

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

# Optional (you can find the email address / ID using `apt-key list`)
sudo apt-key del support@example.com
Run Code Online (Sandbox Code Playgroud)

长版

虽然弃用通知建议将密钥添加到/etc/apt/trusted.gpg.d,但这是一个不安全的解决方案。引用Linux Uprising 的这篇文章

进行此更改的原因是,当将用于对 APT 存储库进行签名的 OpenPGP 密钥添加到 或 时/etc/apt/trusted.gpg/etc/apt/trusted.gpg.d系统上配置的所有其他存储库上的 APT 无条件信任该密钥,即使这些存储库没有signed-by(见下文)选项官方 Debian / Ubuntu 存储库。因此,任何将其签名密钥添加到/etc/apt/trusted.gpg/etc/apt/trusted.gpg.d替换系统上任何软件包的非官方 APT 存储库。因此,此更改是出于安全原因(您的安全)而进行的。

Linux Uprising 文章Debian Wiki上解释了正确的解决方案:将密钥存储在/etc/apt/keyrings/(或者/usr/share/keyrings/如果密钥由软件包管理),然后在 apt 源列表中引用该密钥。

因此,合适的方法如下:

  1. 如果 PGP 密钥目录不存在,则创建该目录,并设置其权限。此步骤和后续步骤将分别显式设置推荐的权限,因为有些人可能设置了奇怪的umask。实际上只有在早于 Debian 12 和 Ubuntu 22.04 的版本中才需要创建该目录,但无论哪种方式运行此行都不会造成伤害。
    sudo mkdir -m 0755 -p /etc/apt/keyrings/
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从 下载密钥https://example.com/EXAMPLE.gpg并将其存储在 中/etc/apt/keyrings/EXAMPLE.gpg。Debian wiki 解释说,您应该删除密钥(即将其从 base64 转换为二进制)以与旧软件兼容。这> /dev/null只是阻止二进制密钥在您的终端中显示。
    wget -O- https://example.com/EXAMPLE.gpg | \
        gpg --dearmor | \
        sudo tee /etc/apt/keyrings/EXAMPLE.gpg > /dev/null;
        sudo chmod 644 /etc/apt/keyrings/EXAMPLE.gpg
    
    Run Code Online (Sandbox Code Playgroud)file /etc/apt/keyrings/EXAMPLE.gpg或者,您可以通过运行并检查输出 来验证您下载的文件确实是 PGP 密钥。
  3. 将密钥添加到存储库使用的源文件中。找到适当的文件/etc/apt/sources.list.d/并编辑它,以便它链接到您刚刚添加的密钥环。如果该文件不存在,您可以创建一个。最后,它应该看起来像这样:
    deb [signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt stable main
    
    Run Code Online (Sandbox Code Playgroud)
  4. (可选)从 中删除该密钥apt-key(如果之前已添加)。运行sudo apt-key list以列出所有密钥,并找到之前添加的密钥。使用密钥的电子邮件地址或指纹,运行sudo apt-key del support@example.com.

使用较新的 DEB822 格式

用于指定 apt 存储库的较新的 DEB822 格式更好且更易于使用,但尚未得到所有平台上的所有工具的完全支持。

简洁版本

不要运行上面提到的脚本,而是运行

deb [signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt stable main
Run Code Online (Sandbox Code Playgroud)

长版

sources.list.d您还可以使用较新的多行格式 DEB822,而不是对 中的源使用单行格式。这种格式对于人类和计算机来说更容易阅读,并且自 2015 年起在 apt 中可用 。Debian 和 Ubuntu 计划从 2023 年末开始使用 DEB822 作为默认格式 。Repolib 的文档进行了很好的比较,并涵盖了新格式背后的动机。。此外,apt 2.2.4 及更高版本支持将公钥直接嵌入到sources.list.

如果您维护托管在第三方存储库上的包,请考虑.sources为您的用户提供可选的填充 DEB822。

目前,这是这个答案中的一个单独部分而不是主要答案的原因是,一些仍然受支持的 Debian 和 Ubuntu 版本附带了旧版本的 apt。具体来说,Debian 9(EOL:2024-06-30)和 Ubuntu 20.04(EOL:2025-05-29)太旧了,但 Debian 10 及更高版本、Ubuntu 22.04 及更高版本还不错。此外,一些解析源文件而不是包装 apt 的工具可能还不能完全支持所有这些功能。

要从一行格式切换到 DEB822 格式,假设您有以下两个文件:

  • /etc/apt/sources.list.d/example.list:
    deb [signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt stable main
    
    Run Code Online (Sandbox Code Playgroud)
  • /etc/apt/keyrings/EXAMPLE.gpg:(
    真正的密钥应该比这个长得多。这个太短了,不安全。)
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    
    mI0EZWiPbwEEANPyu6pUQEydxvf2uIsuuYOernFUsQdd8GjPE5yjlxP6pNhVlqNo
    0fjB6yk91pWsoALOLM+QoBp1guC9IL2iZe0k7ENJp6o7q4ahCjJ7V/kO89mCAQ09
    yHGNHRBfbCo++bcdjOwkeITj/1KjYAfQnzH5VbfmgPfdWF4KqS/TmJP9ABEBAAG0
    G0phbmUgRG9lIDxqYW5lQGV4YW1wbGUub3JnPojMBBMBCgA2FiEEK8v49DttJG7D
    35BwcvTpbeNfCTgFAmVoj28CGwMECwkIBwQVCgkIBRYCAwEAAh4BAheAAAoJEHL0
    6W3jXwk4YLID/0arCzBy9utS8Q8g6FDtWyJVyifIvdloCvI7hqH51ZJ+Zb7ZLwwY
    /p08+Xnp4Ia0iliwqSHlD7j6M8eBy/JJORdypRKqRIbe0JQMBEcAOHbu2UCUR1jp
    jJTUnMHI0QHWQEeEkzH25og6ii8urtVGv1R2af3Bxi9k4DJwzzXc5Zch
    =8hwj
    -----END PGP PUBLIC KEY BLOCK-----
    
    Run Code Online (Sandbox Code Playgroud)

然后您可以将这两个文件替换为单个文件/etc/apt/sources.list.d/example.sources

Types: deb
URIs: https://example.com/apt
Suites: stable
Components: main
Signed-By:
 -----BEGIN PGP PUBLIC KEY BLOCK-----
 .
 mI0EZWiPbwEEANPyu6pUQEydxvf2uIsuuYOernFUsQdd8GjPE5yjlxP6pNhVlqNo
 0fjB6yk91pWsoALOLM+QoBp1guC9IL2iZe0k7ENJp6o7q4ahCjJ7V/kO89mCAQ09
 yHGNHRBfbCo++bcdjOwkeITj/1KjYAfQnzH5VbfmgPfdWF4KqS/TmJP9ABEBAAG0
 G0phbmUgRG9lIDxqYW5lQGV4YW1wbGUub3JnPojMBBMBCgA2FiEEK8v49DttJG7D
 35BwcvTpbeNfCTgFAmVoj28CGwMECwkIBwQVCgkIBRYCAwEAAh4BAheAAAoJEHL0
 6W3jXwk4YLID/0arCzBy9utS8Q8g6FDtWyJVyifIvdloCvI7hqH51ZJ+Zb7ZLwwY
 /p08+Xnp4Ia0iliwqSHlD7j6M8eBy/JJORdypRKqRIbe0JQMBEcAOHbu2UCUR1jp
 jJTUnMHI0QHWQEeEkzH25og6ii8urtVGv1R2af3Bxi9k4DJwzzXc5Zch
 =8hwj
 -----END PGP PUBLIC KEY BLOCK-----
Run Code Online (Sandbox Code Playgroud)

重要的是,您必须将每一行缩进(至少)一个空格,并且必须放置缩进.而不是空行。(删除空行会使密钥无效。)上面的脚本正是这样做的。

最后,如果您有一个指定确切路径的存储库,例如

deb [signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt deb/
Run Code Online (Sandbox Code Playgroud)

那么你的 DEB822必须设置Suites: deb/必须以 结尾/)并且不能Components:一行。

其他资源

  • Debian 开发人员弃用了“apt-key”,没有用同样用户友好且快速的命令来替代它来完成此任务,这使 NSA 和 FSB 得到了巨大的支持......! (48认同)
  • 我关注事物的发展历史,但从用户的角度来看,简洁的“apt-key”CRUD CLI 已被一组松散的建议所取代,仅此而已。 (13认同)
  • @x-yuri,它不仅仅是一个文件副本,它还需要一个文件编辑来引用该新文件,很多错误机会,导致人们简单地忽略警告 - 对于如此敏感的问题,这是不可接受的立场 (5认同)
  • @ankostis MX Linux 有一个“MX Fix GPG 密钥”,可以自动修复它。MX Linux 是最受欢迎的 Debian 发行版(也许是出于这样的原因) (3认同)
  • @ankostis 还有什么比复制文件更方便、更快捷的呢? (2认同)

小智 20

!!已弃用且不安全!

答案在这里找到: https://suay.site/?p=526

简而言之 :

检索密钥并添加密钥:

curl -s URL | sudo gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/NAME.gpg --import
Run Code Online (Sandbox Code Playgroud)

授权用户 _apt :

sudo chown _apt /etc/apt/trusted.gpg.d/NAME.gpg
Run Code Online (Sandbox Code Playgroud)

  • 或者,引用的文章建议将文件权限从 600 更新到 644,而不是“chown”,只是使文件对每个人都可读,因为无论如何它都是公钥:“sudo chmod 644 /etc/apt/trusted.conf”。 gpg.d/NAME.gpg` (6认同)
  • 这是不安全的:所有存储库都将信任该密钥,甚至是您的发行版自己的存储库。这正是 apt-key 必须被弃用的原因。[我在我的回答中解释了 Debian 推荐和 Signal 使用的方法。](/sf/answers/4996884021/) (4认同)
  • @IvanHanák 请注意,虽然这个答案有效,但 Debian 手册(以及其他)建议不要使用它,因为它将信任所有存储库的该密钥,而不仅仅是您在此处添加的存储库。 (4认同)

use*_*640 7

正如当前接受的答案中提到的,向 /etc/apt/trusted.gpg.d 添加密钥是不安全的,因为它添加了所有存储库的密钥。这就是 apt-key 发出此警告的原因。

您可以使用更简单的解决方案,如下所示:

curl -fsSL https://example.com/EXAMPLE.gpg | sudo gpg --dearmor -o /usr/share/keyrings/EXAMPLE.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/EXAMPLE.gpg] \
 https://example.com/apt stable main" \
| sudo tee -a /etc/apt/sources.list.d/EXAMPLE.list > /dev/null

sudo apt update
sudo apt install <package-name>
Run Code Online (Sandbox Code Playgroud)