如何修复丢失的 GPG 密钥,即使它应该已经导入了?

我正在改变在一堆机器上安装Docker的方式如此处所指出。在一个机器上运行得很好,但是这个机器的行为很奇怪。
我已经导入了密钥:
sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.uUGtmucAUd --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyring /etc/apt/trusted.gpg.d/atareao-telegram.gpg --keyring /etc/apt/trusted.gpg.d/neovim-ppa-unstable.gpg --keyring /etc/apt/trusted.gpg.d/nilarimogard-webupd8.gpg --keyring /etc/apt/trusted.gpg.d/ondrej-php-7_0.gpg --keyring /etc/apt/trusted.gpg.d/shutter-ppa.gpg --keyring /etc/apt/trusted.gpg.d/trustdb.gpg --keyring /etc/apt/trusted.gpg.d/trusted.gpg --keyring /etc/apt/trusted.gpg.d/vincent-c-ponysay.gpg --keyring /etc/apt/trusted.gpg.d/webupd8team-y-ppa-manager.gpg --keyring /etc/apt/trusted.gpg.d/xorg-edgers-ppa.gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
gpg: requesting key 2C52609D from hkp server pgp.mit.edu
gpg: [don't know]: invalid packet (ctb=01)
gpg: keydb_get_keyblock failed: eof
gpg: key 2C52609D: public key "Docker Release Tool (releasedocker) <docker@docker.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

尽管如此,sudo apt-get update在缺少密钥的情况下仍然失败。
w: GPG error: https://apt.dockerproject.org ubuntu-trusty Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F76221572C52609D

我错过了什么?
我也尝试了目前提供的答案,但在删除了trusted.gpg文件后,我无法添加密钥。
root@fluttershy:/etc/apt# rm trusted.gpg
root@fluttershy:/etc/apt# apt-key update
gpg: [don't know]: invalid packet (ctb=01)
gpg: keydb_get_keyblock failed: eof
gpg: key 437D05B5: public key "Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>" imported
gpg: [don't know]: invalid packet (ctb=01)
gpg: keydb_get_keyblock failed: eof
gpg: key FBB75451: public key "Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>" imported
gpg: [don't know]: invalid packet (ctb=01)
gpg: keydb_get_keyblock failed: eof
gpg: key C0B21F32: public key "Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>" imported
gpg: [don't know]: invalid packet (ctb=01)
gpg: keydb_get_keyblock failed: eof
gpg: key EFE21092: public key "Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>" imported
gpg: Total number processed: 4
gpg:               imported: 4  (RSA: 2)
root@fluttershy:/etc/apt#

gpg出现“无效数据包(ctb=01)”/“keydb_get_keyblock失败:eof”的错误。通常这意味着您的GPG数据库已损坏。解决此问题的最快方法是删除它。这是一个选项吗? - Andrea Corbellini
@AndreaCorbellini 这取决于被删除和需要重新配置的内容。删除所有供应商的公钥是一个选择,我希望保留自己的私钥和公钥。如果能提供一种列出当前导入的密钥的方法,那就更好了;因为我有几个PPA我想继续使用。 - k0pernikus
@AndreaCorbellini 真是太神奇了,我在阅读 apt-key 命令的输出时是多么有选择性。我只是扫描了最后一行并假设它已经成功运行了。/o'\ - k0pernikus
2个回答

gpg 失败,显示“无效数据包 (ctb=01)”/“keydb_get_keyblock 失败:eof”。这通常意味着你的GPG密钥环已损坏。最快解决问题的方法是删除它,或从备份中恢复。
以下是一些方便的命令供您参考:
列出当前在APT密钥环中的所有密钥: apt-key list
从APT自动备份中恢复trusted.gpg: cp /etc/apt/trusted.gpg{~,}
删除trusted.gpg并重新创建包含Ubuntu存档密钥的文件: rm /etc/apt/trusted.gpg apt-key update 在我使用的所有命令中,我都使用了/etc/apt/trusted.gpg,但请注意,在/etc/apt/trusted.gpg.d/目录下可能还有其他密钥环。
APT同时使用所有密钥环,您可以通过检查输出来确认。
Executing: gpg [...] \
  --keyring /etc/apt/trusted.gpg \
  --primary-keyring /etc/apt/trusted.gpg \
  --keyring /etc/apt/trusted.gpg.d/atareao-telegram.gpg \
  --keyring /etc/apt/trusted.gpg.d/neovim-ppa-unstable.gpg \
  --keyring /etc/apt/trusted.gpg.d/nilarimogard-webupd8.gpg \
  [...]

只要有一个损坏的钥匙环,GPG就会感到伤心,即使是好的钥匙环也不被信任。因此,没有一个密钥被考虑进来。

即使删除了trusted.gpg文件,它仍然会抛出相同的错误。 - k0pernikus
@k0pernikus:你能把你使用的确切命令和apt-key list的输出粘贴过来吗? - Andrea Corbellini
它在apt-key update部分出错了。请看我的问题,我已经添加了这部分。 - k0pernikus
@k0pernikus:trusted.gpg并不是唯一可用的密钥环。在/etc/apt/trusted.gpg.d/目录下还有其他密钥环,看起来问题出在其中一个上面。你应该使用apt-key list命令的输出来检测出哪个是损坏的。 - Andrea Corbellini
最后一部分是关键:我将所有的gpg密钥移出文件夹。然后apt-get update友好地列出了所有缺失的密钥,我只需要按照列表添加它们即可。 - k0pernikus
哪一把钥匙有问题我不知道。如果您能详细说明为什么一把钥匙可能会导致整个钥匙扣崩溃,那就太好了。 - k0pernikus
@k0pernikus:更新的回答 - Andrea Corbellini
@AndreaCorbellini 以下或以上的错误是由于下面的错误的gpg文件引起的吗?gpg:[不知道]:无效数据包(ctb=01)gpg:keydb_search_next失败:无效数据包。 - SebMa

具体来说,对于Docker密钥环58118E89F3A912897C070ADBF76221572C52609D添加密钥服务器:

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D