验证签名档案的 X.509 CoT 的方法

Method to verify a signed archive's X.509 CoT

我试图了解下载存档时验证信任背后的关键高级细节。

这是我对如何实现的理解:

在软件开发人员方面:

  1. 从像 verisign 这样的 public CA 获取证书

  2. 生成存档的哈希值,然后使用证书中的私钥加密此字符串,这就是 "signature"

  3. 托管供下载的存档,以及一个单独的文件,其中包含证书中的 public 密钥 + 在步骤 2 中生成的签名。

在(用户)客户端:

  1. 下载解压压缩包,下载签名+public密钥文件

  2. 使用下载的public密钥解密下载的签名,保存这个值

  3. 遍历嵌入在您的操作系统中的 public 根证书。对于每个根证书,解密签名值并将结果与​​步骤5中的结果进行比较

  4. 一旦在步骤 6 中找到匹配项,您就已验证作者的私钥来自您在步骤 6 中找到的匹配的 CA 的信任链。

    • 这一切都假设软件开发人员使用了我们在我们的客户端中嵌入了根证书的 CA OS。

问题:

  1. 上述方法是否合理,还是我忽略了关键细节?
  2. 给定一个由您控制的空白客户端,如果我想将 public 密钥 + 签名 + 存档组合成一个我可以让客户端理解和解析的文件,是否有任何广泛支持的格式组织这些数据的杠杆?

除了对 Developer (2) 过于具体(它描述了 RSA 签名的工作原理,但 ECDSA 非常适合这项任务)之外,这听起来更像是 Authenticode 减去了一些 EKU 限制。这让我问“为什么不使用 Authenticode 签名?”。

我考虑的结构是 PKCS#7/CMS SignedData 格式。它可以描述来自多个证书的多个签名(ECDSA-brainpoolP320t1-SHA-3-512 对于任何可以阅读它的人来说,RSA-2048-SHA-2-256 对于我们大多数人来说,以及 DSA-1024-SHA- 1 适用于 2001 年组装计算机的任何人)。

对于数据文件,你可以正常使用 SignedData,对于可执行文件,它更难,因为有语义部分(所以你必须将它存放在某个地方并使用间接签名)。

如果您使用 .NET 进行签名,PKCS#7/CMS SignedData 可用于通过 System.Security.Cryptography.Pkcs.SignedCms 进行签名和验证(尽管您可能必须在 class).