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

时间:2016-09-20 21:54:23

标签: security certificate x509 truststore

我正在尝试了解下载档案时验证信任背后的关键高级详细信息。

这是我对如何做到的理解:

在软件开发人员方面:

  1. 从公共CA获取证书,例如verisign

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

  3. 托管存档以供下载,另外还有一个单独的文件,其中包含证书中的公钥+步骤2中生成的签名。

  4. 在(用户)客户端:

    1. 下载并解压缩档案,下载签名+公钥文件

    2. 使用下载的公钥解密下载的签名,保存此值

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

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

      • 这一切都假设软件开发人员在我们的客户端操作系统中使用了我们拥有嵌入式根证书的CA.
    5. 问题:

      1. 上述方法是否合理,还是我忽略了关键细节?
      2. 鉴于您控制的空白平板客户端,如果我想将公钥+签名+存档合并到我可以使客户端理解和解析的单个文件中,是否有任何广泛支持的格式可用于组织此数据?

1 个答案:

答案 0 :(得分:1)

除了对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进行签名和验证(尽管您可能必须在其之外定义自己的链信任规则)类)。