在新的 ubuntu 20.10 虚拟机上为本地存储库设置密钥,我收到一条消息,提示 apt-key add 已弃用,我应该阅读apt-key
(8) 手册页。( apt-key
8) 手册页是串在一起的单词的集合,但如果它包含信息,我就无法将其剔除。谁能告诉我,我应该在终端上输入什么,而不是:
apt-key add name-of-file
在向我鸣喇叭后,该命令显然仍然有效,所以我能够继续,但想知道我将来需要做什么。
在新的 ubuntu 20.10 虚拟机上为本地存储库设置密钥,我收到一条消息,提示 apt-key add 已弃用,我应该阅读apt-key
(8) 手册页。( apt-key
8) 手册页是串在一起的单词的集合,但如果它包含信息,我就无法将其剔除。谁能告诉我,我应该在终端上输入什么,而不是:
apt-key add name-of-file
在向我鸣喇叭后,该命令显然仍然有效,所以我能够继续,但想知道我将来需要做什么。
您需要知道为什么
apt-key add
不推荐使用到目前为止,所有答案都解决了症状(“不要使用
apt-key add
”),但未能解决导致被弃用的实际问题。apt-key add
问题不在于将密钥附加到一个大密钥环文件而不是etc/apt/trusted.gpg
手动将单密钥密钥环文件放入目录/etc/apt/trusted.gpg.d/
中。这两件事是等价的,做任何一件都是巨大的安全风险。问题是您添加到上述任何一个的任何密钥都完全且无条件地被 apt 信任。这意味着当从任何 repo(包括官方发行版 repos)安装任何包时,apt 将愉快地接受由任何这些受信任密钥(无论密钥是否属于包来自的存储库)签名的包。这削弱了包签名机制提供的防止恶意包被注入官方 Ubuntu 镜像网络的保证。
相反,我们想要做的是将 apt 配置为仅在从该存储库安装的软件包上接受来自第三方存储库的签名——没有交叉签名。Apt 的默认固定规则为官方发行版存储库提供更高的优先级,它(与适当的密钥管理相结合)提供了一些保护,防止第三方存储库替换发行版提供的软件包。(至少,我认为这是默认设置。您可以使用它
apt-cache policy
来检查当前的 pin 优先级,如果需要,您可以根据需要调整 pinningorigin
以达到此效果。详情请参阅man apt_preferences
。)Ugo Delle Donne 的答案中给出的将密钥转换为 apt 将接受的(旧)密钥环 v4 格式的说明是正确且有用的,但这只是解决方案的一半。我将在这里重申它们(稍微清理一下),以便将所有步骤合并到一个地方:
wget https://host.domain.tld/path/to/<keyfile>.<ext>
(不需要
-O
or>
;wget
默认将文件保存在当前目录中,文件名与服务器上的文件名相同。)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.list
Ubuntu 22.04 和相关Debian Wiki条目中推荐的约定。此时,什么都没有改变,
apt
也不知道密钥存在。最后一步是修改.list
存储库的特定文件,以告诉 apt 在哪里可以找到该特定 repo的密钥。/etc/apt/sources.list.d/<example>.list
,并在deb
url 之间添加[signed-by=/etc/apt/keyrings/<your-keyfile-name>.gpg]
现在 apt 将接受该 repo 中所有包的密钥签名,并且只接受该 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>
Deb822
或者,您可以使用单个.sources
文件而不是文件切换到更新、更详细的格式.list
。这是更多的工作,但我个人发现结果更具可读性。资料来源:
我偶然发现了同样的问题,幸运的是,其他一些问题照亮了道路。在我的示例中,我试图向最近的 Kali linux 添加一个 teamviewer 存储库,但我被密钥验证阻止了。
我很确定有一种更优雅的方法可以做到这一点,但以下步骤帮助我解决了这个问题:
下载相关密钥
wget -O - https://download.teamviewer.com/download/linux/signature/TeamViewer2017.asc > ~/teamviewer.key
验证文件类型
file ~/teamviewer.key
它应该是PGP 公钥块公钥(旧)
创建密钥环
gpg --no-default-keyring --keyring ./teamviewer_keyring.gpg --import teamviewer.key
该文件仍然不是可以添加到/etc/apt/trusted.gpg.d/的有效密钥,因为它是一个密钥环,但我们可以从密钥环中提取密钥
gpg --no-default-keyring --keyring ./teamviewer_keyring.gpg --export > ./teamviewer.gpg
此文件是您要移动到受信任的密钥文件夹的密钥
sudo mv ./teamviewer.gpg /etc/apt/trusted.gpg.d/
开心
sudo apt update
!!!弃用的原因是 using
apt-key add
只是将 gpg 密钥附加到受信任的全局 APT 密钥环。它类似于 add to 而不是 using 的首选方法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 密钥并将其添加到新的密钥环文件中
为 apt 添加一个源条目,指向这个新的密钥环
从这个新添加的 repo 安装 mongodb
sudo apt install -y mongodb-org
参考
这对我来说仍然是新的,但我所知道的大部分来自unix SE 中的这个出色的答案
我创建了一个 shell 脚本,它可以下载和安装要
[signed-by=]
在sources.list
.它可以在github.com/ameinild/add-apt-key上找到。
作为直接类似的工作,替换
apt-key add
为gpg --dearmor
:curl [KEYURL] | sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/[KEYFILE].gpg
但是,不建议这样做(除了与 apt-key 类似的工作),因为受信任目录中的所有密钥都是无条件受信任的;最好将输出放在(非全局)受信任的目录中(正如其他人所建议的那样),并让每个来源分别指定要信任的密钥。
供使用的密钥
apt
存储在/etc/apt/trusted.gpg.d/
.apt-key
为您管理这些密钥环,但现在它已被弃用,您需要<KEYRING>
自己为密钥环选择合适的文件名。如果您已经将密钥作为本地文件
<FILE>
,请运行要直接从中读取密钥
<URL>
,请运行注意:密钥环
gnupg-ring:
名称前的前缀是创建apt
兼容(旧版)v4 格式的密钥环所必需的,而不是(较新的)keybox v1 格式。这里的所有答案都很棒,我在这里分享的是我从所有这些答案中得到的,并且自动化使我更容易设置机器。
虽然在每台机器上添加 apt 源是一种罕见的情况,但我仍然会在多台机器、云机器等上执行此操作......
以下是我为自己编写的 bash 脚本,用于在我用于 DevOps 工作的基于 ubuntu/pop-os 的机器上添加 APT 源堆栈:
注意:不要只是复制粘贴,如果您不明白发生了什么 - 询问。这些是任何人都不应轻易采取的行动类型。
我的
add-my-apt-repos.sh
脚本(GH?):