验证密钥是否由另一个密钥签名

信息安全 电子签名 RSA 打开pgp
2021-08-29 16:22:42

我开始使用 GPG4Win/Kleopatra,这是适用于 Windows 的 GNU Privacy Guard 实现。最近,我想验证 Qubes OS 的下载,此处提供了指南。他们描述了用于签署较少密钥的主公钥(RSA 4096 位),例如签署特定版本的 Qubes OS 的密钥。我能够使用由正确的较小密钥签名的分离签名哈希来验证我的下载。我将如何验证较小的密钥是否由主密钥签名(假设没有为其提供签名)?

这个问题引发了另一个问题:签名“通常”如何伴随内容?PGP、TLS 等是简单地将签名与密文或填充的原图像连接起来,还是需要两个单独的文件/数据包?非常感谢您提前。

2个回答

检查密钥是否已签名

简短的回答是您使用 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 文件中。

此过程需要注意的重要部分是,对正在验证的原始文件的任何更改都会产生完全不同的哈希字符串。因此,当您运行验证命令时,本地计算机上发生的情况是您的系统正在创建给定文件的自己的哈希值,并检查它是否与签名文本中的哈希值匹配。如果它们都匹配,并且签名被验证为来自您已经决定信任的密钥,那么您知道密钥的所有者已经“签署”了您下载的文件版本。

正确验证密钥签名是--check-signatures这样执行的:

$ gpg --check-signatures
pub   rsa4096 2017-03-06 [SC]
      5817A43B283DE5A9181A522E1848792F9E2795E9
uid           [ unknown] Qubes OS Release 4 Signing Key
sig!3        1848792F9E2795E9 2017-03-06  Qubes OS Release 4 Signing Key
sig!         DDFA1A3E36879494 2017-03-08  Qubes Master Signing Key

最后还会显示好/坏签名数量的摘要...

gpg: 2 good signatures

这似乎是一个很小的细节,但不幸的是 gpg 传达有关密钥的重要信息的方式是神秘的。sig除非指示符后面紧跟一个!感叹号,否则密钥签名不会被报告为良好/正确。错误的签名显示为减号。使用“列表”命令不会执行此验证(请注意使用时缺少的符号--list-sig),这就是问题所在。