如何修复丢失的 GPG 密钥?

我刚刚安装了Ubuntu 12.04,并添加了一些软件源,当我执行apt-get update命令时,出现了缺少gpg密钥的错误。
以下命令似乎对我无效:
apt-get update 2> /tmp/keymissing; for key in $(grep "NO_PUBKEY" /tmp/keymissing |sed "s/.*NO_PUBKEY //"); do echo -e "\nProcessing key: $key"; gpg --keyserver subkeys.pgp.net --recv $key && sudo gpg --export --armor $key | apt-key add -; done

如何解决这个问题?

2如果回答这个问题时能够解释为什么会出现这个错误,以及未来如何避免它,那就太好了。 - Flimm
我使用Y-ppa-manager解决了我的问题。感谢Ashu提供的解决方案! - user152704
1详细解决方案附带截图:http://opensourceforgeeks.blogspot.in/2013/04/w-gpg-error-httpppalaunchpadnet-precise.html - Aniket Thakur
2相关链接:http://askubuntu.com/q/13065/178596 - Wilf
这个修复已经有11年了(或者至少4年了),需要更新。S.O.应该考虑重新开始,允许新的更新问题和答案。 - undefined
14个回答

我喜欢这个解决方案,重新从Ubuntu密钥服务器下载丢失的密钥。
对于Ubuntu:
- [UBUNTU:修复UBUNTU中的GPG密钥](link1)
在我的情况下。
 Reading package lists... Done  
 W: GPG error: http://ppa.launchpad.net precise 
 Release: The following signatures couldn't be verified because the public key is not available: 
 NO_PUBKEY 2EA8F35793D8809A

这是添加错误信息中提到的缺失键的命令。
sudo apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 2EA8F35793D8809A

所以我拿着丢失的密钥2EA8F35793D8809A,并向keyserver.ubuntu.com请求将其添加到我的apt密钥列表中。
对于Linux Mint, 你的key server稍有不同:keyserver.linuxmint.com
sudo apt-key adv --recv-key --keyserver keyserver.linuxmint.com "missing key"

备用密钥服务器可尝试
keyserver.ubuntu.com

1http://askubuntu.com/a/136735/10998 对我没有起作用。 - nelaaro
没问题。需要忽略原始博客文章中的引号。 - AGamePlayer
这对我也起作用了。我认为这是所有解决方案中最简单的一个。 - Cristiana Nicolae
8这样做会有安全隐患吗?我只是通过HTTP下载一个公钥,对吗? - Ajedi32
迄今为止在AskUbuntu上的最佳答案。 - user103154
Ubuntu密钥服务器是什么? - Quazi Irfan
1@iamcreasy,为了向Ubuntu安装证明您正在安装的软件包是安全的且没有恶意软件,每个软件包都由Ubuntu密钥服务器签名。因此,您的安装程序会检查您正在安装的软件包是否来自可信且经过验证的来源。我没有找到太好的相关文档,但这可能会有所帮助:gpg文档 - nelaaro
2我已经创建了一个函数来添加所需的密钥 adkeys (){ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys "$1";} 为了删除重复或有问题的密钥,我通常会这样做:grep -ril "pattern" /etc/apt | sudo xargs rm -f - SergioAraujo
1我推荐使用 --keyserver ha.pool.sks-keyservers.net。这是一个高可用性的密钥服务器池,极大地增加了您获取所需密钥的机会。 - Robin like the bird
@Ajedi32 不,这没有任何安全隐患。这是一个公开的密钥。如果在传输过程中被篡改,签名验证将失败,但并不会有风险。 - kynan
1@kynan 如果你试图验证的文件的签名也在传输过程中被篡改,那就不行了。这样中间人攻击者可以使得签名验证成功,对吗?使用未知密钥验证一个可能已经被篡改的文件有什么意义呢? - Ajedi32
@Ajedi32 我明白这可能是一个攻击途径,但通常包都是通过安全连接获取的。请查阅有关GPG密钥获取安全隐患的更多信息,请访问https://security.stackexchange.com/a/4162/200010。 - kynan

有一个叫做"Y PPA manager"的软件,它可以帮助修复GPG密钥错误。
Y PPA manager

安装方法 -

sudo add-apt-repository ppa:webupd8team/y-ppa-manager  
sudo apt-get update  
sudo apt-get install y-ppa-manager    

安装完成后,启动应用程序,然后进入“高级”选项,并选择“导入所有缺失的 GPG 密钥”。

2你必须在这个命令前面加上sudo! sudo apt-get... - Fih
这个对我也起作用,我对Y PPA Manager的干净、易于使用的界面印象深刻,这是一个不错的发现,谢谢Ashu。 - CoalaWeb
我按照你说的做了,但是什么都没发生。我的意思是在菜单里找不到这个应用程序。 - Cristiana Nicolae
@CristianaNicolae 安装完成后,您可以在“应用程序”>“系统工具”下找到Y PPA管理器。 - Ashu
抱歉,阿舒,我已经反复检查了,但仍然找不到。看起来它安装在系统的某个地方,但由于某些原因,在菜单中没有显示出来。 - Cristiana Nicolae
@Cristiana - 如果安装正确,请在终端中输入以下命令:sudo y-ppa-manager - Yo Yo Saty Singh
安装一个神奇地为您处理问题的软件并不是一个真正的解决方案。 - michael.schuett

使用apt-key adv --recv-keys进行自动下载可能在防火墙后无法工作。
在这种情况下,请在您的网络浏览器中打开Ubuntu密钥服务器的网页,并搜索字符串0x<您缺失密钥的十六进制代码>

打开链接在“pub”部分。将关键内容(从“-----BEGIN PGP PUBLIC KEY BLOCK-----”到“-----END PGP PUBLIC KEY BLOCK-----”)保存为文件。

然后运行:
sudo apt-key add <file-with-saved-key>

来源:http://opensourceforgeeks.blogspot.in/2013/04/w-gpg-error-httpppalaunchpadnet-precise.html


首先在终端中输入以下命令。
 sudo rm /var/lib/apt/lists/* -vf

然后在终端中输入以下命令来更新您的系统。
 sudo apt-get update && sudo apt-get upgrade

在此之后,不应该再有任何错误,一切都应该正常工作。

谢谢回复。我问题的解决方法其实很简单:在输入上面的命令之前,先输入sudo su - Fih
虽然这样做可能会对你有所帮助,但是sudo su绝不是正确的方法——在这种情况下,你应该使用sudo -s来达到你的目的。 - guntbert
我认为你的意思是 sudo rm /var/lib/apt/lists/* -rf(选项为"r"而不是"v")。 - Oliboy50
12同时使用sudorm是危险的。同时使用rm*也是危险的。如果在同一条命令中使用这三个命令,会导致鲨鱼咬你或者咬你的文件。 - JB.
1这对我来说行不通。 - WiSaGaN

对于Ubuntu 12.04 Precise:永久解决方案

针对在添加新仓库并更新仓库列表后出现的错误信息,提供一个永久解决方案。这是由于服务器地址不再有效所导致的。只需将地址更改为一个可用的地址即可。

  1. 用文本编辑器打开文件~/.gnupg/gpg.conf

    在终端中输入:gedit ~/.gnupg/gpg.conf

  2. 然后,在该文件中找到以下粗体行(第116行)(默认情况下应如下所示):

    [...]
    keyserver hkp://keys.gnupg.net
    # keyserver mailto:pgp-public-keys@keys.nl.pgp.net
    # keyserver ldap://keyserver.pgp.com

  3. 然后添加以下粗体行,最终得到以下结果:

    (将第二行注释掉旧地址的方法是在前面加上#符号)

    [...]
    keyserver http://keyserver.ubuntu.com
    # keyserver hkp://keys.gnupg.net
    # keyserver mailto:pgp-public-keys@keys.nl.pgp.net
    # keyserver ldap://keyserver.pgp.com

  4. 保存文件并尝试再次更新:

    在终端中输入:sudo apt-get update


根据nelaar的回答:
sudo apt-get update 2>&1 1>/dev/null | sed -ne 's/.*NO_PUBKEY //p' |
while read key; do
    echo 'Processing key:' "$key"
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys "$key"
done

脚本将所有错误转储到临时文件中,然后循环遍历这些错误,并导入缺失的键。

使用Y PPA管理器是最简单的方式。
sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install y-ppa-manager 

从Dash打开Y PPA管理器

enter image description here

输入管理员密码

enter image description here

双击高级选项

enter image description here

点击尝试导入所有缺失的GPG密钥

enter image description here

点击确定以修复它

我成功的方法是先删除密钥,然后重新安装。为了实现这一点,我按照以下步骤进行操作:
root@ > ~: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 630239CC130E1A7FD81A27B140976EAF437D05B5

删除中。
root@ > ~: sudo apt-key del 630239CC130E1A7FD81A27B140976EAF437D05B5

然后,输入以下命令重新安装:
root@ > ~: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 630239CC130E1A7FD81A27B140976EAF437D05B5

我想在bash脚本中自动修复此类错误。对于任何感兴趣的人,这个应该有用:

sudo apt-get update 2> /tmp/keymissing
if [ -f /tmp/keymissing ]
then
    for key in $(grep "NO_PUBKEY" /tmp/keymissing |sed "s/.*NO_PUBKEY //")
        do 
        echo -e "\nProcessing key: $key"
        sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $key
        sudo apt-get update
    done
    rm /tmp/keymissing
fi

你真是个救命稻草,兄弟。 - Shankar Thyagarajan

最简单的方法就是:
sudo apt-key adv --refresh-keys --keyserver keyserver.ubuntu.com
或者如果在代理后面:
sudo apt-key adv --refresh-keys --keyserver keyserver.ubuntu.com --keyserver-options http-proxy=http://myproxy:123
(当然,将myproxy:123替换为您实际使用的代理)