无法使“gpg --auto-key-retrieve --verify”工作

无法使“gpg --auto-key-retrieve --verify”工作

我正在尝试在我的开发机器上自动编译最新的 GCC,并且我也想自动验证 tarball 的签名。但是,我无法开始gpg --auto-key-retrieve工作:

gcc# gpg --auto-key-retrieve --verify gcc-11.1.0.tar.xz.sig tarballs/gcc-11.1.0.tar.xz
gpg: Signature made Tue Apr 27 12:39:44 2021 CEST
gpg:                using RSA key 6C35B99309B5FA62
gpg: Can't check signature: No public key

如果我手动检索密钥,它可以正常工作(并且也会gpg --verify成功):

gcc# gpg --recv-keys 6C35B99309B5FA62
gpg: /home/user/.gnupg/trustdb.gpg: trustdb created
gpg: key 6C35B99309B5FA62: public key "..." imported
gpg: Total number processed: 1
gpg:               imported: 1

(上面使用的默认密钥服务器是https://keys.openpgp.org:443

我试过了:

  • --keyserver-options auto-key-retrieve
  • 手动指定服务器,
  • 自动密钥定位(尽管我知道这与我的用例无关)。

我究竟做错了什么?

我在 Ubuntu 20.04.2 上运行 gpg 版本 2.2.19,并处理来自http://ftp.gnu.org/gnu/gcc/gcc-11.1.0/

答案1

签名是使用旧版 GnuPG 制作的,该版本未添加“发行者指纹”子包。如果没有此扩展,PGP 签名将包含仅有的签名者密钥的 64 位“密钥 ID”(即整个 SHA-1 指纹的最后 64 位),这不足以明确地确定要验证的正确密钥。

以前的 GnuPG 版本只是简单地在密钥服务器中搜索密钥 ID(就像您所做的那样)并下载找到的任何结果。但是,现在可以使用选定的密钥 ID 创建 PGP 密钥 - 32 位“短”ID 很简单,64 位“长”ID 仍然相对困难,但并非不可能。(例如,创建 SHA 哈希具有选定的 64 位后缀的数据字面上地他们如何“挖掘”比特币区块。

因此,为了防范各种攻击(例如有人发布格式错误的密钥,其 ID 与合法开发人员的 ID 匹配),GnuPG 不再对未指示完整 160 位密钥指纹的签名启用“自动密钥检索”。

$ gpg --list-packets < gcc-11.1.0.tar.gz.sig
# 关闭=0 ctb=89 标签=2 hlen=3 plen=540
:签名包:算法1,密钥ID 6C35B99309B5FA62
        版本 4,创建于 1619519994,md5len 0,sigclass 0x00
        摘要算法 2,摘要 ae b1 的开始
        散列子包 2 长度 4 (签名创建于 2021-04-27)
        subpkt 16 len 8(发行者密钥 ID 6C35B99309B5FA62)
        数据:[4095位]
$ gpg --detach-sign 测试
$ gpg --list-packets < test.sig
# 关闭=0 ctb=88 标签=2 hlen=2 plen=117
:签名包: 算法 22, 密钥 ID 11319E694F0B2ABB
        版本 4,创建于 1622789848,md5len 0,sigclass 0x00
        摘要算法 9,摘要开始 ed 7f
        散列子包 33 长度 21(发行者 fpr v4 19E6940AE6C3EDC5D6A7684211319E694F0B2ABB)
        散列子包 2 长度 4 (签名创建于 2021-06-04)
        subpkt 16 len 8(发行者密钥 ID 11319E694F0B2ABB)
        数据:[255 位]
        数据:[256 位]

相关内容