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

C 验证签名/证书的最佳方法是什么?,c,windows,winapi,C,Windows,Winapi,我正在处理一个应用程序,其中我必须验证两个文件是否使用相同的证书与我们的证书进行了签名。如果没有,则中止程序 我发现问题在于,我应该做什么: 完全验证证书链以确保证书的完整性和真实性 检查发卡机构名称 检查主题名称 检查密钥使用字段。 因此,对于步骤1,我使用WinVerifyTrust,然后阅读属性,并将它们相互比较。 到目前为止还不错,但是如果有人创建了一个证书,并用它们对这两个文件进行签名呢?那么它仍然可以工作。我知道,如果此证书未添加为受信任的发布者,则WinVerifyTrust将失败

我正在处理一个应用程序,其中我必须验证两个文件是否使用相同的证书与我们的证书进行了签名。如果没有,则中止程序

我发现问题在于,我应该做什么:

完全验证证书链以确保证书的完整性和真实性 检查发卡机构名称 检查主题名称 检查密钥使用字段。 因此,对于步骤1,我使用WinVerifyTrust,然后阅读属性,并将它们相互比较。 到目前为止还不错,但是如果有人创建了一个证书,并用它们对这两个文件进行签名呢?那么它仍然可以工作。我知道,如果此证书未添加为受信任的发布者,则WinVerifyTrust将失败。但是我们可以说,它是作为一个受信任的发布者添加的。然后它就起作用了。显然,我不能在代码中写入像我的公司名称这样的值,并检查属性是否具有此值

那么我如何检查它是否真的是我的证书呢?如果它确实是一个受信任的证书,而不仅仅是我或其他人信任的证书


提前谢谢

如果您只能访问证书颁发者的公钥,并且您信任该公钥,那么您可以通过其他方式获得它——它不随您正在验证的证书一起提供,您已经将其存储在本地或类似的地方——这是拥有证书链的唯一原因,您只需验证签名是否有效即可确保用户证书有效。证书链仅用于确保您有一条路径来确保证书有效性,直至您信任的根证书(通常是软件发行版附带的根证书)

仅当您根据证书中存储的信息拥有不同的配置文件或帐户类型时,才需要主题检查或其他证书字段。您对证书的主题格式或字段的使用取决于应用程序。通常,人们会在证书中嵌入有关用户帐户的信息,以便您可以使用证书分发帐户信息

请记住,证书只是一个公钥和一些其他信息,无论您希望它用于什么目的,都可以由受信任的机构进行签名。这可以是一个中间证书或根证书。因此,一旦您验证了签名,您就可以获得对内容的中间信任。如果没有访问证书颁发者的私钥以便能够再次签名,则无法更改证书内容,以便在签名验证为ok时可以信任该数据


如何测试证书是否真的属于您?当然,它必须由证书颁发者签名——可以是您,也可以是您信任的颁发者,并验证该颁发者是该颁发者,而不是其他证书。对于公司应用程序,您必须检查其中一个签名者是否是每个应用程序或应用程序模块的证书颁发机构,通常会生成一个或多个证书颁发者,如果您在证书链中找到该颁发者,则每个人都会签署属于该模块的用户证书,然后您可以信任证书的预期用途。

可能的副本我会尝试检查证书的哈希值,或其他一些不易伪造的数字。@DavidGrayson:听起来不错,但我如何检查哈希值?@DavidGrayson:我可以使用“CryptQueryObject”检索我需要的数据,但我如何确保,其他人没有使用自己的证书在文件上签名。我应该检查什么以确保文件使用我的证书签名?这个杂凑听起来不错。也是一个可能的复制品,谢谢你的回答!最后一部分是我想做的,我只是不知道怎么做。我知道我必须打电话给CertGetCertificateChain,但在那之后我就被卡住了。也许你有一些代码示例,我怎么做我想做的事?所以如果你认为它是一个有效的答案,请标明它。评论也是受欢迎的:我会,我只是等待,如果你有一些代码:我的问题实际上是编码它。我知道我应该做什么,只是不知道如何编码。经验法则是:如果证书中没有嵌入有用的信息,只需验证证书,只需沿着证书链一直到根证书搜索一个受信任的证书,以防找到受信任的证书,提交的证书是有效的,您必须允许访问,如果无效,您不能允许访问,因为无效的证书必须被视为一块垃圾并放弃请求。如果您在证书中有感兴趣的信息,请仅在有效的情况下使用。请检查我的其他问题。也许你更明白我想要什么。