GnuPG查询个人邮箱公钥时出现大量‘key not found’错误的解决咨询
看起来你遇到的这个问题挺蹊跷的——GnuPG明明找不到那些密钥,却又一个劲儿地报它们的ID,而且只在查你自己的邮箱时触发,查其他UID就没事。我来给你捋捋可能的原因和解决办法:
问题复现
你执行的命令和报错信息如下:
$ gpg --list-keys intelfx@intelfx.name gpg: key "09F4605E1379E1909AAC87B10874248396A58CF5" not found: Not found gpg: key "1141EF4806D03A7AFFF4B48AE31AF27D2BF9FD6F" not found: Not found # ... 其余类似错误信息省略 ... pub rsa4096/0x281015BE2CAC2CBC 2015-12-19 [C] Key fingerprint = 31EF DDC9 8A18 FA61 0D38 9A3D 2810 15BE 2CAC 2CBC uid [ultimate] Ivan Shapovalov <intelfx@intelfx.name> uid [ultimate] Ivan Shapovalov <intelfx100@gmail.com> # ... 正常密钥输出省略 ...
可能原因
这种情况大概率是GnuPG的UID-密钥ID反向映射缓存残留导致的:GnuPG曾经通过某个渠道(比如旧的密钥服务器同步、曾经临时关联过的密钥)把你的邮箱和那些不存在的密钥ID绑定过,现在缓存没清干净,导致查询邮箱时它先去查这些绑定的密钥,结果找不到就抛出错误。
解决步骤
1. 清理GnuPG缓存文件
GnuPG的临时缓存和备份文件可能存了旧的映射记录,先把它们删掉:
# 先关闭所有GnuPG相关进程,再执行以下命令 rm -rf ~/.gnupg/pubring.kbx~ ~/.gnupg/pubring.gpg~ ~/.gnupg/trustdb.gpg~ rm -rf ~/.gnupg/cache/
这些文件都是临时生成的,删除后GnuPG会自动重建。
2. 强制刷新密钥索引
清理缓存后,让GnuPG重新整理密钥环的映射关系:
gpg --refresh-keys gpg --list-keys --refresh-cache
--refresh-cache参数会强制更新UID和密钥ID的关联数据。
3. 检查是否有隐藏的密钥残留
有时候可能存在标记为删除但未彻底清理的密钥条目,你可以用详细格式查看所有密钥信息,确认是否有异常:
gpg --list-public-keys --with-colons | grep -E "^pub|^uid|^fpr"
如果发现那些不存在的密钥ID相关条目,尝试用gpg --delete-keys <密钥ID>删除(不过你之前试过没用的话,这步主要是排查用)。
4. 排查密钥服务器同步问题
如果你配置了自动同步密钥服务器,可能是服务器上残留了你的邮箱和那些密钥的关联记录。可以先临时禁用自动拉取:
gpg --keyserver-options no-auto-key-retrieve --list-keys intelfx@intelfx.name
如果这样就不报错了,说明是密钥服务器的问题。你可以清理本地密钥服务器缓存,或者修改~/.gnupg/gpg.conf里的密钥服务器配置,避免自动拉取无关密钥。
最后手段:重建GnuPG环境
如果以上方法都没用,你可以备份好自己的密钥后,重新初始化GnuPG:
# 备份自己的密钥 gpg --export-secret-keys intelfx@intelfx.name > my-secret-keys.asc gpg --export intelfx@intelfx.name > my-public-keys.asc # 删除旧的GnuPG目录 rm -rf ~/.gnupg # 重新初始化GnuPG gpg --gen-key # 导入备份的密钥 gpg --import my-secret-keys.asc gpg --import my-public-keys.asc
这步是兜底方案,尽量先尝试前面的步骤。
备注:内容来源于stack exchange,提问作者intelfx

