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

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

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

有什么想法或建议吗?

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

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

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

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

.NET程序集有两种签名技术:strongnaming和Authenticode(authenticode用于签署PE和其他一些文件,而不仅仅是.NET程序集)。 它们用于不同的目的。 证书仅在Authenticode中用于对作者进行身份validation。 Strongnaming根本不对作者进行身份validation。

除了检查签名之外,还必须validation证书以确保它是为给定作者颁发的。 正确validation是一个复杂的过程,涉及CRL(证书撤销列表)和OCSP(在线证书状态)检查。

要执行Authenticode签名validation,您需要Authenticodevalidation组件。 其中一个选项是使用我们的SecureBlackbox产品的PKIBlackbox包。 该软件包包括Authenticodevalidation以及完整的证书validation机制。

请注意,如果您不打算validation证书,则根本无法validation签名,因为可以创建具有相同主题,序列号等的自签名证书,并使用它来签署伪造的程序集。

您可以在这里尝试三个选项。

1)第一个是像这里一样使用Assembly load:

Assembly myDll = Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1"); 

您可以使用以下强名称(Sn.exe)命令打印特定程序集的公钥和公钥标记的hex格式:

 sn -Tp  

如果您有公钥文件,则可以使用以下命令(请注意命令行选项的大小写):

 sn -tp  

2) 这里提到第二个。 并使用p / Invoke来解决此类问题。

3)同样存在第三种,更敏捷,更复杂的方法。 这是一个约束政策 。 如果您应该为已部署的应用程序提供升级,则可以将其考虑在内。 当您的应用程序可以从中获益的新版本的共享组件时,应用程序策略文件将允许您提供这些好处,而无需重新编译或替换现有安装。

您可以在此处找到有关此function的更多信息

http://msdn.microsoft.com/en-us/library/aa309359%28v=vs.71%29.aspx

http://ondotnet.com/pub/a/dotnet/2003/03/17/bindingpolicy.html

我相信有一种方法可以使用强名来达到“信任”的目的。 据我所知,Microsoft仅建议使用强名称来确保程序集内容未被修改,并建议使用“Authenticode”进行信任。

但是如果加载器应用程序(加载这些程序集/程序的应用程序)维护它可以加载的“程序集”的加密列表; 不会解决“信任”问题吗?

例如,包加载程序可以使用公钥维护程序集名称,并通过完整的程序集名称加载程序集/程序?