检查密钥是否已签名
简短的回答是您使用 command gpg --list-sig <key id>。
例如,我去了您上面列出的站点并下载了 qubes 版本 2 签名密钥。然后我将该密钥导入本地 gpg 密钥环:
$ gpg --import qubes-release-2-signing-key.asc
结果如下
pub rsa4096/0A40E458 2012-11-15 [SC]
uid [ unknown] Qubes OS Release 2 Signing Key
要检查密钥是否已签名,可以使用命令gpg --list-sig <key id>。
在这种情况下,我们可以看到密钥 ID0A40E458来自上面的输出:
$ gpg --list-sig 0A40E458
pub rsa4096/0A40E458 2012-11-15 [SC]
uid [ unknown] Qubes OS Release 2 Signing Key
sig 3 0A40E458 2012-11-15 Qubes OS Release 2 Signing Key
sig 36879494 2012-11-15 [User ID not found]
最后一个条目是 Qubes 主密钥,但它是未知的,因为我的密钥环上没有它。如果我然后下载主密钥,并将其添加到密钥环:
$ gpg2 --import ./qubes-master-signing-key.asc
gpg: key 36879494: public key "Qubes Master Signing Key" imported
gpg: Total number processed: 1
gpg: imported: 1
我可以再次验证并看到发布密钥已正确签名:
$ gpg2 --list-sig 0A40E458
pub rsa4096/0A40E458 2012-11-15 [SC]
uid [ unknown] Qubes OS Release 2 Signing Key
sig 3 0A40E458 2012-11-15 Qubes OS Release 2 Signing Key
sig 36879494 2012-11-15 Qubes Master Signing Key
验证签名
当使用 gpg 密钥对文件进行签名时,会创建一个单独的签名文件。以 qubes 为例,他们发布了一个.DIGESTS文件。有关如何检查此类摘要的更多详细信息,请参阅您提供的链接中的标题“验证摘要”。
基本上,他们所做的是获取据称来自他们的文件,并针对它运行各种哈希算法。散列函数将接受一个输入文件或消息,并输出一个唯一的、相当短的散列字符串。这是以加密方式创建的,因此很难或几乎不可能找到任何其他会产生相同输出的文件。
然后他们用他们的 GPG 密钥签署这个哈希字符串。该散列文本的散列和签名都放在 .DIGESTS 文件中。
此过程需要注意的重要部分是,对正在验证的原始文件的任何更改都会产生完全不同的哈希字符串。因此,当您运行验证命令时,本地计算机上发生的情况是您的系统正在创建给定文件的自己的哈希值,并检查它是否与签名文本中的哈希值匹配。如果它们都匹配,并且签名被验证为来自您已经决定信任的密钥,那么您知道密钥的所有者已经“签署”了您下载的文件版本。