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


146

我不再需要服务器的密钥环中的密钥。是否可以删除它?我使用以下命令添加了密钥:

 curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -

感谢您的帮助


我发现此问题很有用,因为当前称为Ubuntu 18.04的GUI Software & Updates-->Authentication似乎无法正常工作(无法删除任何受信任的软件密钥)。相反,必须使用下面给出的clicmds。
太阳熊

Answers:


198

首先,您需要找到添加的密钥的密钥ID。通过以下命令执行此操作:

sudo apt-key list

它将列出您拥有的所有键,每个条目如下所示:

pub   1024R/B455BEF0 2010-07-29
uid                  Launchpad clicompanion-nightlies

确定要删除的密钥后,请使用命令sudo apt-key del <keyid>where <keyid>被替换为要从密钥环中删除的密钥的实际密钥ID。

$ sudo apt-key del B455BEF0
$ apt-key list | grep clicompan
$

@Raymond没问题:)
Nitin Venkatesh

1
啊,我看到唯一的ID在标为pub的行上,而不是标为uid的行上。
ctrl-alt-delor 2016年

6
在Ubuntu 16.10上的结果似乎有些不同:pub rsa4096 2012-05-11 [SC] 8439 .... uid ....
mxdsp

似乎需要更新18.04
kennyB

删除密钥后,我遇到了一个新问题The following signatures couldn't be verified because the public key is not available: NO_PUBKEY,下一步该怎么办?
科里

124

在16.10上,当您使用list命令时,不再显示短键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


17
非常有帮助,谢谢。这对UX毫无帮助。
SColvin

10
@SColvin您可以这样做sudo apt-key del "8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092",我认为使用整个指纹比较安全,密钥ID可以重复(至少当您将PGP用于电子邮件时,我读到您应该共享整个指纹,而不仅仅是密钥ID)。
baptx

1
非常有帮助,对于17.10也很真实!
Hartmut P.

2
并为18.04.1。
Russ Bateman '18

谢谢。糟糕的设计决策。
Brian Smith

4

我编写了一个简短的脚本,使事情变得简单,并使用字符串而不是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-B 1前行
  • > result.temp:将其保存在文件中(以后将其删除)

如果返回正好2行(->恰好有1个键),我继续:

  • grep 'pub':现在仅采用pup键为id 的行
  • cut -d " " -f 4:以该行的第4个字为例(第一个是pub两个空格,比``之后的字符串)
  • cut -d "/" -f 2:仅在之后参与 /

最后删除这个键并清理

  • apt-key del ${KEYID}(以我为例11F63C51
  • rm result.temp:不再需要此文件

我在没有参数的情况下运行了它,它只是消灭了我所有的键。;(
Gabriel Fair

如果有人
Gabriel Fair

?这怎么发生的?如果没有参数,它应该以“未提供键名”退出
。– derHugo

@derHugo不确定,但可能是#该if子句中的罪魁祸首吗?

@defuzed,如果您的意思是否$#。它返回给定参数的数量。
derHugo

2

我知道我可能会迟到,但只想分享这一行命令即可实现这一目标。

注意:仅当输出是唯一键时,这才起作用。


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 "/")

FOOBARUID名称在哪里。


从16.10开始的Ubuntu版本:

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

FOOBARUID名称在哪里。


1
我不确定为什么,但是在尝试运行16.04您提供的命令时出现错误。awk: line 1: syntax error at or near {但是角括号匹配,所以我不确定为什么这不起作用
Gabriel Fair

@GabrielFair感谢您注意,6月份它一直在工作(我从控制台复制粘贴了它),但是现在好像已经更新,apt-key list格式已经更改。现在,它似乎又开始工作了。(编辑:请记住以超级用户身份运行它)
David Tabernero M. 18/12/22
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.