验证签名/证书的最佳方法是什么?

时间:2015-01-05 15:52:54

标签: c windows winapi

我正在开发一个应用程序,我必须验证2个文件是否使用相同的证书(使用我们的证书)进行签名。如果没有,则中止该程序。

我在this问题中找到了我应该做的事情:

  1. 完全验证证书链以确保证书的完整性和真实性
  2. 检查发行人姓名
  3. 检查主题名称
  4. 检查密钥用法字段。
  5. 因此对于第1步,我使用WinVerifyTrust,然后我阅读了属性,并将它们相互比较。
    到目前为止一切都那么好,但如果有人创建了证书,并用它们签署这两个文件呢?然后它仍然有效。我知道,如果此证书未添加为Trusted Publisher,则WinVerifyTrust将失败。但是,比方说,它被添加为Trusted Publisher。然后它工作。显然我不能在代码中写出“我公司名称”这样的值,并检查属性是否具有此值。

    那么如何检查它是否真的是我的证书?如果它真的是一个“值得信赖”的证书,不仅被我或其他人信任吗?

    提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您有权访问证书颁发者(只是公钥)并且您 信任 那个公钥(您已通过其他方式获得了它 - 它没有& #39;来自您正在验证的证书,您已将其存储在本地等等 - 这是拥有证书链的唯一理由)您只需要验证签名是否有效以确保用户证书有效。证书链只是为了确保您有一个路径来确保证书有效性,直到您信任的根证书(通常是软件分发附带的根证书)

只有在您拥有不同的配置文件或帐户类型时,才需要

主题检查(或其他证书字段),具体取决于证书中存储的信息。您对主题格式或包含证书的字段的用途取决于应用程序。通常,人们在证书中嵌入有关用户帐户的信息,以便您可以使用证书来分发帐户信息。

请记住,证书只是一个公钥(以及您希望它用于任何目的的一些其他信息)由受信任的机构签署(这可以是中间证书或根证书),因此,一旦您验证签名,你对内容有中等的信任。如果不访问证书颁发者的私钥(以便能够再次签名),则无法更改证书内容,以便在签名验证正常时可以信任该数据。

如何测试证书是否属于您的证书?当然,它必须由证书颁发者签署(这可以是您或您信任的发行人)并验证发行人是否是其他证书。在公司应用程序的情况下,您必须检查其中一个签名者是否为证书颁发机构(通常对于每个应用程序或应用程序模块,生成一个或多个证书颁发者,每个签名用户证书属于该模块)如果您发现证书链中的颁发者,您可以信任该证书以用于预期用途。