[ad_1]
本文解释了如何在 Debian、Ubuntu 和基于这些的 Linux 发行版(如 Linux Mint、Pop!_OS、Elementary OS 等)上安全地添加 OpenPGP 密钥和第三方 APT 存储库,以替换已弃用的 apt-key
.
当您尝试使用添加 APT 存储库密钥时 apt-key
在基于这些的 Debian、Ubuntu 和 Linux 发行版上,您将看到以下消息:“警告:不推荐使用 apt-key。 改为在 trust.gpg.d 中管理密钥环文件(请参阅 apt-key(8))”。
这 apt-key
手册页提到“不推荐使用 apt-key,除了在维护者脚本中使用 apt-key del 从主密钥环中删除现有密钥”。 更重要的是, ”apt-key 将在 Debian 11 和 Ubuntu 22.04 中最后可用。”
此更改的原因是在添加用于签署 APT 存储库的 OpenPGP 密钥时 /etc/apt/trusted.gpg
或者 /etc/apt/trusted.gpg.d
,在系统上配置的所有其他存储库上,APT 无条件信任该密钥,这些存储库没有 signed-by
(见下文)选项,甚至是官方的 Debian / Ubuntu 存储库。 因此,任何将其签名密钥添加到的非官方 APT 存储库 /etc/apt/trusted.gpg
或者 /etc/apt/trusted.gpg.d
可以替换系统上的任何包。 因此,此更改是出于安全原因(您的安全)。
还值得注意的是,虽然 apt-key
弃用消息说“改为在 trust.gpg.d 中管理密钥环文件”,Debian wiki 另有说明。 那是因为将 OpenPGP 密钥添加到 /etc/apt/trusted.gpg
和 /etc/apt/trusted.gpg.d
如上所述,同样不安全。
您现在可以继续使用 apt-key,因为它仍然有效。 但是,开始过渡到使用 signed-by
选项如下所述,特别是如果您维护第三方存储库。
那么在基于这些的 Debian、Ubuntu 和 Linux 发行版(如 Linux Mint、Pop!_OS、Elementary OS 等)上添加第三方(非官方)存储库及其 OpenPGP 签名密钥的正确、安全的方法是什么,以替换不推荐使用 apt-key?
1.下载APT存储库密钥
根据 Debian wiki,密钥应该通过 HTTPS 下载到一个只能由 root 写入的位置,例如 /usr/share/keyrings
. 密钥名称应包含描述存储库的短名称,后跟 archive-keyring
. 例如,如果存储库被调用 myrepository
,密钥文件应命名为 myrepository-archive-keyring.gpg
.
OpenPGP 密钥文件可以是 ascii-armored,也可以不是。 验证密钥文件是否为 ascii-armored, 下载密钥文件并运行此命令 (请注意,密钥扩展名可以是 .gpg、.asc、.key,也可能是其他):
file <repo-key>.gpg
如果此命令的输出类似于以下内容,则密钥为 ascii-armored:
repo-key.gpg: PGP public key block Public-Key (old)
话虽如此,这就是如何正确、安全地下载存储库签名密钥并将其添加到您的系统:
- 对于 ascii-armored OpenPGP 密钥
要使用 wget 下载并将这样的 OpenPGP 密钥添加到您的系统,请使用:
wget -O- <https://example.com/key/repo-key.gpg> | gpg --dearmor | sudo tee /usr/share/keyrings/<myrepository>-archive-keyring.gpg
此命令中的所有内容/含义:
wget
从下载密钥https://example.com/key/repo-key.gpg
并将密钥输出到标准输出(-O-
)。 将此处的 URL 替换为要下载并添加到系统的密钥的 URLgpg --dearmor
: 这gpg
command是OpenPGP加密和签名工具; 它的--dearmor
选项解包来自 OpenPGP ASCII 盔甲的输入sudo tee /usr/share/keyrings/<myrepository>-archive-keyring.gpg
: 作为超级用户 (sudo
),读取标准输入,在这种情况下是由提供的输出gpg --dearmor
,并将其写入/usr/share/keyrings/<myrepository>-archive-keyring.gpg
文件。 更换<myrepository>
name 带有您要添加的存储库密钥的描述性名称
例如,要添加 Signal 应用程序 APT 存储库,您可以使用:
wget -O- https://updates.signal.org/desktop/apt/keys.asc | gpg --dearmor | sudo tee /usr/share/keyrings/signal-archive-keyring.gpg
或者使用 Debian wiki 上作为示例给出的命令(您需要以 root 身份运行它,例如在运行后 sudo -i
; 它用 curl
代替 wget
下载密钥):
curl <https://example.com/key/repo-key.gpg> | gpg --dearmor > /usr/share/keyrings/<myrepository>-archive-keyring.gpg
使用此命令添加 Signal APT 存储库的示例:
curl https://updates.signal.org/desktop/apt/keys.asc | gpg --dearmor > /usr/share/keyrings/signal-archive-keyring.gpg
- 对于非 ascii-armored OpenPGP 密钥
使用 wget 下载 OpenPGP 密钥并将其添加到您的系统中:
wget -O- <https://example.com/key/repo-key.gpg> | sudo tee /usr/share/keyrings/<myrepository-archive-keyring.gpg>
或者使用在 Debian wiki 上作为示例给出的命令(您需要以 root 身份运行它,例如在运行之后 sudo -i
):
wget -O /usr/share/keyrings/<myrepository-archive-keyring.gpg> <https://example.com/key/repo-key.gpg>
我没有在这里添加示例,因为我找不到使用非 ascii-armored OpenPGP 密钥的第三方存储库。
- 将 OpenPGP 密钥直接从密钥服务器导入到文件
/usr/share/keyrings
:
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/<myrepository>-archive-keyring.gpg --keyserver <hkp://keyserver.ubuntu.com:80> --recv-keys <fingerprint>
代替 hkp://keyserver.ubuntu.com:80
,如果您愿意,您可以使用其他一些密钥服务器。
我们将 Linux Uprising Shutter PPA 的 OpenPGP 密钥导入到的示例 /usr/share/keyrings/linux-uprising-shutter-archive-keyring.gpg
(指纹可以通过单击 PPA 页面上的绿色“有关此 PPA 的技术详细信息”链接获取 – 它位于“将此 PPA 添加到您的系统”下):
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/linux-uprising-shutter-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 1CC3D16E460A94EE17FE581CEA8CACC073C3DB2A
如何防止软件包在 Ubuntu、Debian 或 Linux Mint 中更新 [APT]
2.添加存储库sources.list条目
第三方存储库 sources.list 条目应添加到 /etc/apt/sources.list.d
目录,而不是直接在 /etc/apt/sources.list
文件。
以前,sources.list 文件来自 /etc/apt/sources.list.d
目录如下所示:
deb https://repository.example.com/debian/ stable main
但是,为了能够使用在第 1 步中添加的密钥,sources.list 条目现在必须如下所示(/etc/apt/sources.list.d/<myrepository.list>
):
deb [signed-by=/usr/share/keyrings/<myrepository>-archive-keyring.gpg] <https://repository.example.com/debian/ stable main>
重要的是要注意,如果您还想添加 arch=amd64
选项与 signed-by
,您需要用空格分隔这两个选项,如下所示:
deb [arch=amd64 signed-by=/usr/share/keyrings/<myrepository>-archive-keyring.gpg] <https://repository.example.com/debian/ stable main>
例如,要将 Signal 存储库添加到您的 Debian / Ubuntu 系统,请创建一个文件(以 root 身份;例如,使用此文件打开 Nano 命令行文本编辑器: sudo nano /etc/apt/sources.list.d/signal.list
) 称为 signal.list
在 /etc/apt/sources.list.d
包含以下内容(假设您已经按照上述说明下载了密钥,如 /usr/share/keyrings/signal-archive-keyring.gpg
):
deb [arch=amd64 signed-by=/usr/share/keyrings/signal-archive-keyring.gpg] https://updates.signal.org/desktop/apt xenial main
记得跑 sudo apt update
添加新的签名密钥和存储库后,更新软件源。
您也可以添加 Deb822 文件格式的存储库,但为了尽量不让事情变得更加复杂,我不会在这里解释。 您可以在 Debian wiki 上阅读相关内容。
您可能还喜欢:如何在 Ubuntu、Debian 或 Linux Mint 上查找提供文件(已安装或未安装)的软件包
如何删除已添加到 APT 可信密钥环(/etc/apt/trusted.gpg 或 /etc/apt/trusted.gpg.d)的现有 OpenPGP 密钥
如上所述添加 OpenGPG 密钥时,您需要从 /etc/apt/trusted.gpg 或 /etc/apt/trusted.gpg.d 中删除相同的密钥,以防您之前已将其添加到那里。 如果不这样做,就没有额外的安全优势。
从现有的 OpenPGP 密钥中删除 /etc/apt/trusted.gpg.d
目录 应该很容易。 那是因为密钥文件名应该非常具有描述性。 例如,我系统上此目录中的 Tor 存储库 gpg 密钥文件名是 deb.torproject.org-keyring.gpg
因此,要摆脱已添加到的现有密钥 /etc/apt/trusted.gpg.d
,您所要做的就是删除密钥文件。 您需要以 root 身份执行此操作,因此要么以 root 身份打开您选择的文件管理器,使用 admin://
(例如,要在 Nautilus 中以 root 身份打开一个位置,请按 Ctrl + L
所以你可以输入它的地址栏,然后输入 admin:///etc/apt/trusted.gpg.d
),或从命令行中删除它们,使用:
sudo rm /etc/apt/trusted.gpg.d/<myrepository-keyring.gpg>
下面的说明也适用于从 /etc/apt/trusted.gpg.d
目录。
至于 删除存储在的 APT gpg 密钥 /etc/apt/trusted.gpg
,事情有点复杂。 使用以下命令列出所有导入的 APT OpenPGP 密钥 /etc/apt/trusted.gpg
和 /etc/apt/trusted.gpg.d
:
apt-key list
存储在的密钥 /etc/apt/trusted.gpg
应该列在顶部,然后是来自 /etc/apt/trusted.gpg.d
目录。 你需要检查钥匙 uid
为了找出您要删除的密钥。 通常,uid 应该显示签署密钥的公司或用户,然后是他们的电子邮件地址。
钥匙来自 /etc/apt/trusted.gpg
被列出 apt-key
像这样的列表(示例):
pub rsa4096 2016-04-22 [SC]
B9F8 D658 297A F3EF C18D 5CDF A2F6 83C5 2980 AECF
uid [ unknown] Oracle Corporation (VirtualBox archive signing key) <[email protected]>
sub rsa4096 2016-04-22 [E]
密钥 ID 是 GPG 密钥指纹的最后 8 个字符(因此在本例中,即 2980AECF
)。
删除一个键(从任一 /etc/apt/trusted.gpg
或者 /etc/apt/trusted.gpg.d
),您现在可以使用:
sudo apt-key del <KEY-ID>
例如,要从上面的示例中删除密钥,您可以使用:
sudo apt-key del 2980AECF
您可能喜欢:如何在 Ubuntu、Debian 或 Linux Mint 上列出存储库中的所有软件包 [APT]
参考:
- https://wiki.debian.org/DebianRepository/UseThirdParty
- https://askubuntu.com/a/1307181/1149075
- https://zebnemeth.wordpress.com/2021/01/15/install-signal-desktop-using-gpg/
- https://github.com/docker/docker.github.io/issues/11625
感谢 u/ZebNemeth 的建议!
[ad_2]