如何删除我使用apt-key add -添加的gpg密钥?

我不再需要服务器密钥环中的密钥了。可以将其删除吗?我是使用以下命令添加的密钥:
 curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -

谢谢你的帮助
8个回答

在16.10版本中,当您使用列表命令时,不再显示短密钥ID,但实际上它是长十六进制的最后8个字符。
例如,以下密钥的密钥ID为:
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg
------------------------------------------------------
pub   rsa4096 2012-05-11 [SC]
      8439 38DF 228D 22F7 B374  2BC0 D94A A3F0 EFE2 1092
uid           [ unknown] Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

密钥ID将为EFE21092


34非常有帮助,谢谢。这个用户体验极其不友好。 - SColvin
36@SColvin 你可以直接执行 sudo apt-key del "8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092",我认为使用整个指纹更安全,因为keyid可能会有重复(至少在使用PGP发送电子邮件时,我读到应该分享整个指纹而不仅仅是keyid)。 - baptx
4这绝对是最愚蠢的 --help 列表之一(根本不清楚 id 是什么意思)。 - Amos Folarin

首先,您需要找到您添加的密钥的密钥ID。通过以下命令来完成这个步骤:
sudo apt-key list

它将列出您拥有的所有密钥,每个条目都会像这样显示:
pub   1024R/B455BEF0 2010-07-29
uid                  Launchpad clicompanion-nightlies

一旦你弄清楚要移除哪个密钥,使用命令sudo apt-key del <keyid>,其中<keyid>被实际要从密钥环中移除的密钥的keyid替代。
$ sudo apt-key del B455BEF0
$ apt-key list | grep clicompan
$

@Raymond 没问题,放心吧 :) - Nitin Venkatesh
4啊,我明白了,唯一标识符在标记为“pub”的那一行上,而不是标记为“uid”的那一行。 - ctrl-alt-delor
17在Ubuntu 16.10上,结果似乎有些不同: pub rsa4096 2012-05-11 [SC] 8439 .... uid .... - mxdsp
7看起来这个需要更新到18.04版本。 - kennyB
删除密钥后,我遇到了一个新的问题:“由于公钥不可用,无法验证以下签名:NO_PUBKEY”。接下来我该怎么办? - Corey
我找到了答案,在/etc/apt/sources.list文件中,在repo之前加上#,然后重新运行sudo apt update,在我的Ubuntu 18.04上有效。 - Corey
5从@wesam的回答中得知,自16.10版本开始,在使用列表命令时不再显示短密钥ID,而实际上它是长十六进制字符串的最后8个字符。 - sorrow poetry
由于密钥ID不再显示,请直接使用“pub”下的长十六进制字符串,并将其放在引号中。 - robsn

Ubuntu 20.04 更新

运行后

sudo apt-key list

你应该获取apt密钥列表。
/etc/apt/trusted.gpg
--------------------
pub   rsa4096 2016-04-12 [SC]
      EB4C 1BFD 4F04 2F6D DDCC  EC91 7721 F63B D38B 4796
uid           [ unknown] Google Inc. (Linux Packages Signing Authority) <linux-packages-keymaster@google.com>
sub   rsa4096 2019-07-22 [S] [expires: 2022-07-21]

pub   rsa4096 2017-04-11 [SC] [expired: 2019-09-28]
      D4CC 8597 4C31 396B 18B3  6837 D615 560B A5C7 FF72
uid           [ expired] Opera Software Archive Automatic Signing Key 2017 <packager@opera.com>

pub   rsa4096 2019-09-12 [SC] [expires: 2021-09-11]
      68E9 B2B0 3661 EE3C 44F7  0750 4B8E C3BA ABDC 4346
uid           [ unknown] Opera Software Archive Automatic Signing Key 2019 <packager@opera.com>
sub   rsa4096 2019-09-12 [E] [expires: 2021-09-11]

pub   rsa4096 2017-03-13 [SC]
      8CAE 012E BFAC 38B1 7A93  7CD8 C5E2 2450 0C12 89C0
uid           [ unknown] TeamViewer GmbH (TeamViewer Linux 2017) <support@teamviewer.com>
sub   rsa4096 2017-03-13 [E]

uid下,您可以找到应用程序的名称,例如:
[ unknown] Opera Software Archive Automatic Signing Key 2019 <packager@opera.com>

你想要删除的键位于它的上方。
    D4CC 8597 4C31 396B 18B3  6837 D615 560B A5C7 FF72  <-- THAT'S THE KEY
uid           [ expired] Opera Software Archive Automatic Signing Key 2017 <packager@opera.com>

你可以通过将该键放在双引号或单引号中来删除它,就像这样:

sudo apt-key del "D4CC 8597 4C31 396B 18B3  6837 D615 560B A5C7 FF72"

对我来说,也可以通过取密钥的最后8个字符并去除之间的空格来实现:sudo apt-key del A5C7FF72。 - Purefan
2是的...我认为即使你拿走那个密钥的任何部分,它也能工作,因为它会在整个密钥中搜索不带空格的模式。 - lewis4u

我写了一个简短的脚本,以便更方便地使用字符串而不是ID。
如果键包含你知道的唯一字符串,你可以使用我的脚本。例如,在我的情况下是用于webmin。
pub   1024D/11F63C51 2002-02-28
uid                  Jamie Cameron <jcameron@webmin.com>
sub   1024g/1B24BE83 2002-02-28

我确定只有我的系统上的webmin密钥是“jcameron”,所以我使用这个脚本来删除相应的密钥。
我将其保存为“~/removeAptKey”。
然后运行它。
sudo ./removeAptKey jcameron

输出应该是这样的
KEYID: 11F63C51
OK

这是我的剧本:
#!/bin/bash

function printKeys(){
    echo "Installed keys are"
    echo ""
    sudo apt-key list
}

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

if [[ $# -eq 0 ]]
then
    echo "No key name provided"
    exit 1
fi

UNIQUE=$1

sudo apt-key list | grep "${UNIQUE}" -B 1 > result.temp

LENGTH=$(cat result.temp | wc -l)

if [[ ${LENGTH} -gt 2 ]]
then
    echo "Attention you found more than 1 key. Use a more specific string."
    printKeys
    exit 2
fi

if [[ ${LENGTH} != 2 ]]
then
    echo "Key not found. Doing nothing."
    printKeys
    exit 3
fi

KEYID=$(cat result.temp | grep 'pub' | cut -d " " -f 4 | cut -d "/" -f 2)
echo "KEYID: "$KEYID

apt-key del ${KEYID}

rm result.temp

首先,我获取我的密钥块的前两行:
- `sudo apt-key list`:通常列出apt密钥 - `grep '${UNIQUE}' -B 1`:只取包含唯一密钥字符串`jcameron`的那一行,并且再往前取一行 - `> result.temp`:将其保存在一个文件中(稍后会删除)
如果返回的确切是2行(-> 得到了确切的1个密钥),我继续执行以下步骤:
- `grep 'pub'`:现在只取带有`pub`密钥ID的那一行 - `cut -d " " -f 4`:取该行的第四个单词(第一个是`pub`,然后是两个空格,然后是我们要找的字符串) - `cut -d "/" -f 2`:只取斜杠后面的部分
最后,删除此密钥并进行清理。
  • apt-key del ${KEYID}(在我的情况下是11F63C51
  • rm result.temp:不再需要这个文件了

2我没有使用参数运行这个程序,结果把我所有的密钥都清空了。;( - Gabriel Fair
2如果其他人的密钥也被删除了,我按照以下说明成功修复了:https://askubuntu.com/a/145933/13693 - Gabriel Fair
呼?这是怎么发生的?如果没有参数,它应该返回一个“未提供键名”的错误。 - derHugo
@derHugo 不确定,但是可能那个 if 语句中的#符号是罪魁祸首吗? - defuzed
@defuzed 如果你指的是 $#,那么不是。它返回给定参数的数量。 - derHugo

我知道我可能有点晚了,但是我想分享一下这个一行命令来实现这个目标。
注意:只有在输出是唯一键的情况下才有效。
Ubuntu版本直到16.04(更新于2018年12月22日):
apt-key del $(apt-key list | awk 'NR=='$(apt-key list | grep --line-number --regexp "FOOBAR" | cut --fields 1 --delimiter ":")'{print;exit}' | awk '{print $2}' | cut --fields 2 --delimiter "/")

其中FOOBAR是UID名称。


Ubuntu版本从16.10开始:

apt-key del $(apt-key list | awk 'NR=='`expr $(apt-key list | grep --line-number --regexp "FOOBAR" | cut --fields 1 --delimiter ":") - 1`'{print;exit}')

其中FOOBAR是UID名称。


1我不确定为什么,但是当我尝试运行你提供的16.04命令时出现了错误。awk: line 1: syntax error at or near { 但是尖括号是匹配的,所以我不确定为什么这个命令不能正常工作。 - Gabriel Fair
@GabrielFair 谢谢你注意到了,六月份的时候它是可以工作的(我从我的控制台复制粘贴过来),但现在似乎已经更新了,apt-key list 的格式也发生了变化。现在看起来又可以工作了。(编辑:记得以超级用户身份运行此命令) - David Tabernero M.

我做了这件事,
sudo apt-key list

找到“expired”键,然后删除它,在我的情况下,
sudo apt-key del "31CF B0B6 5659 B5D4 0DEE  C98D DFA1 75A7 5104 960E"

然后做。
sudo apt update

删除的键将会提示“不可用”的注释,对我来说是DFA175A75104960E 然后像这样更新键,对于我的情况,需要更新DFA175A75104960E。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DFA175A75104960E

现在应该可以了。

如果你碰巧有一个 `.asc` 的密钥文件,你可以通过以下命令确保你删除的是正确的密钥。(将 `mykey.asc` 替换为你的密钥文件)
apt-key del "$(gpg -n -q --import --import-options import-show mykey.asc | grep '^pub' -A 1 | tail -n 1 | xargs)"

这个命令似乎适用于Ubuntu 20.04。感谢maxschlepzig提供的gpg命令,他们在here中给出了答案。

当我像这样删除一个键时,终端会告诉我“OK”,但是后来错误消息仍然相同。我需要重新启动吗? - SL5net
@SL5net 我觉得你在运行这个命令后不需要重新启动,但是你可能需要运行 apt update。虽然我写这个答案已经有一段时间了。你收到了什么错误信息? - fakedad

也许我有所遗漏...但是你也可以使用软件更新器的设置界面上的图形用户界面。

screenshot


是的,确实...那就更容易了。 - lewis4u