如何将GPG密钥添加到apt源密钥环中?

Ubuntu Doc页面上说:

建议您添加Opera GPG密钥。

wget -qO - http://deb.opera.com/archive.key | sudo apt-key add -

我应该在哪里添加?

我想采纳这个建议,但不知道软件中心的哪个部分可以添加GPG密钥。


3我相信这是一个在终端中输入的一行命令。 - Mateo
1在Ubuntu中,.msi被称为.deb。 - Alvar
6顺便提一下,如果你通过非HTTPS获取密钥,会破坏签名包所添加的任何安全性。在可能的情况下,你应该通过安全通道(https://)下载密钥。 - user304335
5不要使用apt-key。 - user307747
8个回答

这是一个在终端中输入的一行命令。请参阅什么是终端,如何打开和使用它? 要使用它,您需要将整个命令粘贴到终端中(记得使用https)。
wget -qO - https://deb.opera.com/archive.key | sudo apt-key add -

当然,仅仅复制和粘贴命令而不知道它们的作用,并且没有关于如何撤销它们操作的说明,这确实让人望而生畏。所以这里对这些命令进行了基本的解释:
  • wget 从服务器下载文件。请参考wget手册(适用于Ubuntu 16.04)
  • | 是一个管道符号,将一个命令的输出作为另一个命令的输入。
  • apt-key add 添加一个软件包密钥。
所以基本上,这个命令是先下载密钥,然后在同一个命令中添加它。
我已经测试过这个命令,应该可以正常工作。
现在要验证它是否成功,请执行以下命令(来自此答案):
apt-key list

这将列出添加的键和来自Opera的键,应该像这样列在底部:
pub   1024D/30C18A2B 2012-10-29 [expires: 2014-10-29]
uid                  Opera Software Archive Automatic Signing Key 2013 <packager@opera.com>
sub   4096g/C528FCA9 2012-10-29 [expires: 2014-10-29]

链接的答案还显示,如果需要的话,您可以使用以下方法删除键:
sudo apt-key del 30C18A2B

30C18A2B 作为列表中的键ID。


执行完该命令,并按照你的截图中的设置准确地进行操作:
sudo apt-get update
sudo apt-get install opera

(注意,这里有一些随机的警告,但不会影响安装或软件中心的操作)
而且对于卸载(以防万一):正确的完全卸载应用程序的方法是什么?

总结一下:

  • 添加仓库 enter image description here
  • 使用 apt-key 添加密钥
  • 在终端中使用 apt-get 安装
  • 在 Dash 中搜索 enter image description here

4"apt-key adv" 允许用户从公钥服务器下载密钥。 - jeremiah
在使用apt-key add命令添加密钥后,可以毫无顾虑地删除.key文件(在这种情况下是"archive.key"),对吗?密钥(即信息,而非文件)已经被添加到某个列表中,所以文件应该不再需要了。 - Cerran
3@Cerran,没错。APT将密钥存放在其他地方(例如/etc/apt/trusted.gpg.d//var/lib/apt/keyrings/)。 - Alexis Wilke
1如果您在使用wget时遇到SSL错误,可以改用curl命令:curl -L https://deb.opera.com/archive.key | sudo apt-key add - - rubo77
apt-key不是已经弃用了吗?我到处都看到这个警告。比如说,在这里(Nvidia Cuda的安装指南):https://docs.nvidia.com/cuda/archive/11.7.1/cuda-installation-guide-linux/index.html#ubuntu-installation-network - GuiMendel

如果您正在手动添加来自PPA的密钥,请使用

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 00000000

用第二部分密钥替换00000000,该密钥在PPA网站上通知要添加的。
例如,如果您找到这行:
 4096R/7BF576066

只使用第二部分(无论其大小),在这个例子中是7BF576066

类似于gpg: keyserver receive failed: No keyserver availablegpg: keyserver receive failed: Connection refused这样的错误常见吗? - iuridiniz
不,这样的错误并不常见。也许你输入了错误的键值。 - Paulo Coghi
3没有apt-key的等效命令:sudo gpg --keyserver hkp://keyserver.ubuntu.com:80 --no-default-keyring --keyring /usr/share/keyrings/my-ppa.gpg --recv-keys 00000000 - eddygeek
1FYI,eddygeeks的评论有效。这应该是一个完整的答案。但是我已经用来自互联网其他地方的错误指令填充了my-ppa.gpg。我首先必须删除旧式的my-ppa.gpg。如果不删除该文件,按照这个步骤我会遇到错误。 - undefined
1谢谢@JoshuaClayton,我更新了答案。 - undefined

较新版本的apt还支持以下功能:
apt-key adv --fetch-keys http://deb.opera.com/archive.key

这种方法还提供了更详细的反馈,例如:
gpg: key 7BD9BF62: public key "signing key <username@domain.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

这还有一个额外的好处,就是不需要额外的依赖,比如wget或curl。

1apt-key adv 在 https 上似乎无法正常工作。 - danihodovic
5@dani-h 如果你使用的是GPG 1.x版本,你需要安装gnupg-curl才能使用HTTPS。 - Tao Wang
1apt-key adv --fetch-keys 只会从 URL 中获取 一个 密钥,如果 URL 包含多个密钥,请改用 wget | apt-key add - Tao Wang
1看起来已经可以使用https了(在Ubuntu 17.10上进行了测试)。 - user1182474

apt-key现在似乎已经被弃用了,我创建了一个脚本来检测并获取丢失的密钥,你可以在这里点击获取。
#!/bin/sh -e
tmp="$(mktemp)"
sudo apt-get update 2>&1 | sed -En 's/.*NO_PUBKEY ([[:xdigit:]]+).*/\1/p' | sort -u > "${tmp}"
cat "${tmp}" | xargs sudo gpg --keyserver "hkps://keyserver.ubuntu.com:443" --recv-keys  # to /usr/share/keyrings/*
cat "${tmp}" | xargs -L 1 sh -c 'sudo gpg --yes --output "/etc/apt/trusted.gpg.d/$1.gpg" --export "$1"' sh  # to /etc/apt/trusted.gpg.d/*
rm "${tmp}"

你不应该通过apt-key add添加第三方密钥。这些密钥可以用来签署您机器上的任何软件包,包括存档中的软件包。现在,您应该只允许该密钥仅签署特定的软件包。请参考Trudy用户在UNIX.SE上的完整回答

假设您想要添加 docker 的存储库密钥(一个ASCII编码的密钥):

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
    | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

如果你不确定密钥是否为ASCII编码的话:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | file -
/dev/stdin: PGP public key block Public-Key (old)

对于非装甲钥匙,输出将类似于:
/dev/stdin: OpenPGP Public Key Version 4, Created ..., RSA (Encrypt or Sign, 4096 bits); User ID; Signature; OpenPGP Certificate

并且添加它,您需要:
$ sudo curl -fsSL https://... -o /etc/apt/keyrings/NAME.gpg

更多相关信息可以在这里找到。但它建议将密钥安装到/usr/share/keyrings,这是软件包维护者的位置。下面有更多相关信息。
对于apt < 2.4.0,您需要在添加密钥(Debian链接)之前创建/etc/apt/keyrings

apt (2.4.0)不稳定;紧急程度=中 ...

  • 安装一个空的/etc/apt/keyrings目录。该目录旨在提供一个替代方案,用于放置与signed-by一起使用的密钥。

这意味着在Ubuntu 22.04 Jammy之前,Debian 12 Bookworm

废弃apt-key是一项安全措施。您可以在此处了解更多信息。因此,将文件添加到/etc/apt/trusted.gpg.d也是不安全的。因为/etc/apt/trusted.gpg.d是一种在不使用apt-key add的情况下向密钥环(/etc/apt/trusted.gpg)添加密钥的方法,通过复制文件。

还请注意以下内容

密钥环的推荐位置是由软件包管理的密钥环位于/usr/share/keyrings,而系统操作员管理的密钥环位于/etc/apt/keyrings。


apt-key2.1.8Debian链接)起已被弃用:

apt (2.1.8) 不稳定版;紧急程度=中 ...

  • 完全弃用apt-key,计划在2022年第二季度移除
就发布而言,那将是 Ubuntu 21.10 Impish, Debian 11 BullseyeCommit (Debian 链接)。
1.1.exp9 版中添加了在 apt 源中指定 signed-by 的功能 (Debian 链接)。
apt (1.1~exp9) 实验性版本;紧急程度=中等 ... - 为 sources.list 实现 Signed-By 选项 提交记录Debian 链接)。

另一种方式是仅使用.asc密钥,您可以下载.asc密钥并将其添加到密钥环中。

例如 -

curl -L https://packages.riot.im/debian/repo-key.asc | sudo apt-key add -

在将您的PGP密钥存储在trusted.gpg.d之前,请确保进行“去装甲”(即转换为二进制):
cat mykey.gpg | gpg --dearmor > /etc/apt/trusted.gpg.d/mykey.gpg