我正在尝试在我的开发机器上自动编译最新的 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 位]