如何以编程方式验证程序集是否使用特定证书进行签名?

Aar*_*ron 19 .net c# digital-certificate assembly-signing

我的方案是我们有一个程序(exe),如果在特定文件夹中找到,将启动其他程序.我想确保它只启动使用我们的公司证书(Verisign批准等)签署的计划.从本质上讲,它只会以与自身相同的证书启动程序.我不想发送证书本身.

我一直在搜索网络和系统名称空间,并没有找到一个明确的例子,从文件中读取证书数据并验证它,并可以检查另一个文件.我发现的最接近的是Signtool,并且在单独的exe中进行此验证有点少.我知道强命名的东西不会有帮助,因为数字签名的文件是不同的,如此处有用的解释(http://blog.codingoutloud.com/2010/03/13/three-ways-to-tell-whether-an-assembly- dl-is-strong-named /)SO中的其他一些示例显示了原始数据的加密和验证,但没有以某种方式将它打包在一起的程序集.

任何想法或建议?

Kri*_*erA 17

这是一篇博客文章,其中包含有关如何验证程序集签名的代码示例:http:
//blogs.msdn.com/b/shawnfa/archive/2004/06/07/150378.aspx

最后的代码示例显示了如何验证程序集是否由Microsoft签名 - 您可以通过获取公司证书的证书令牌来执行相同操作.

更新:用户@Saber使用以下更新对此进行了编辑,但该更新被其他人拒绝.但是,这是非常有效的建议,所以我重新发布他/她的编辑,因为SO不会让我批准它:

编辑(谢谢你,OP):如果你想更安全地执行此操作(即使程序更加防篡改),请在程序中引用一个用相关键强命名的程序集,然后使用引用程序集的标记与调用程序集的标记进行比较.如果使用字节数组(根据链接),可以简单地进行十六进制编辑和更改.

  • 为什么选择downvote?_Read_我链接到的博客文章,您将看到它确实显示了强大的命名如何链接到程序集签名,并且您_can_使用它来验证程序集是否已使用特定证书进行签名. (4认同)
  • @jmbpiano 截至 2020 年高度相关,因为它似乎已经消失了。 (3认同)
  • 我正在通过 API 调用验证客户端计算机上的证书是否可信。如何在不将程序集加载到当前应用程序域中的情况下检查公钥令牌?.Net 框架似乎没有办法做到这一点。 (2认同)
  • 链接的博客文章肯定有帮助,但我不能凭良心赞成纯粹的链接答案。不需要完全复制博客文章的内容,但至少这个答案应该包含所用技术的提及(调用 StrongNameSignatureVerificationEx),允许未来的访问者在他们无法访问链接时独立研究解决方案出于任何原因。 (2认同)
  • 这是 Wayback Machine 索引的最后一个有效时间:https://web.archive.org/web/20151223032841/http://blogs.msdn.com/b/shawnfa/archive/2004/06/07/ 150378.aspx (2认同)