我的方案是我们有一个程序(exe),如果在特定文件夹中找到,将启动其他程序。我想确保它只启动使用我们的公司证书(Verisign批准等)签署的计划。从本质上讲,它只会以与自身相同的证书启动程序。我不想自己运送证书。
我一直在搜索网络和系统命名空间,但没有找到一个明确的例子,它从文件中读取证书数据并验证它,并可以检查另一个文件。我发现的最接近的是Signtool,并且在单独的exe中进行此验证有点少。我知道强命名的东西不会有帮助,因为数字签名的文件是不同的,如此处有用的解释(http://blog.codingoutloud.com/2010/03/13/three-ways-to-tell-whether-an-assembly- dl-is-strong-named /)SO中的其他一些例子显示了原始数据的加密和验证,但没有以某种方式将它打包在一起的汇编。
有任何想法或建议吗?
答案 0 :(得分:17)
这是一篇博客文章,其中包含有关如何验证装配签名的代码示例:
http://blogs.msdn.com/b/shawnfa/archive/2004/06/07/150378.aspx
最后的代码示例显示了如何验证程序集是否由Microsoft签名 - 您可以通过获取公司证书的证书令牌来执行相同的操作。
更新:用户@Saber使用以下更新对此进行了编辑,但其他人拒绝了该更新。但是,这是非常有效的建议,所以我重新发布他/她的编辑,因为SO不会让我批准它:
编辑(谢谢你,OP):如果你想更安全地做这件事(即让你的程序更加防篡改),请在程序中引用一个用相关键强命名的程序集,然后使用引用程序集的标记与调用程序集的标记进行比较。如果使用字节数组(根据链接),可以简单地进行十六进制编辑和更改。
答案 1 :(得分:3)
.NET程序集有两种签名技术:strongnaming和Authenticode(authenticode用于签署PE和其他一些文件,而不仅仅是.NET程序集)。它们用于不同的目的。证书仅在Authenticode中用于对作者进行身份验证。 Strongnaming根本不对作者进行身份验证。
除了检查签名之外,还必须验证证书以确保它是为给定作者颁发的。正确验证是一个复杂的过程,涉及CRL(证书撤销列表)和OCSP(在线证书状态)检查。
要执行Authenticode签名验证,您需要Authenticode验证组件。其中一个选项是使用我们的SecureBlackbox产品的PKIBlackbox包。该软件包包括Authenticode验证以及完整的证书验证机制。
请注意,如果您不打算验证证书,则根本无法验证签名,因为可以创建具有相同主题,序列号等的自签名证书,并使用它来签名锻造装配。
答案 2 :(得分:3)
你可以在这里尝试三个选项。
1)第一个使用装配加载,如下所示:
Assembly myDll =
Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1");
您可以使用以下强名称(Sn.exe)命令打印特定程序集的公钥和公钥标记的十六进制格式:
sn -Tp <assembly>
如果您有公钥文件,则可以改用以下命令(请注意命令行选项的区别):
sn -tp <assembly>
2)第二个is mentioned here。并使用p / Invoke来解决此问题。
3)同样存在第三种,更敏捷,更复杂的方式。这是绑定政策。如果您应该为已部署的应用程序提供升级,则可以将其考虑在内。当您的应用程序可以从中受益时,应用程序策略文件将允许您提供这些好处,而无需重新编译或替换现有安装。
您可以在此处找到有关此功能的更多信息:
http://msdn.microsoft.com/en-us/library/aa309359%28v=vs.71%29.aspx
http://ondotnet.com/pub/a/dotnet/2003/03/17/bindingpolicy.html
答案 3 :(得分:0)
我相信有一种方法可以使用强名来实现&#34; Trust&#34;。据我所知,Microsoft仅推荐使用强名称来确保程序集内容未被修改,并建议使用&#34; Authenticode&#34;为了信任。
但是如果加载器应用程序(加载这些程序集/程序的应用程序)维护一个加密列表&#34; Assemblies&#34;它可以加载;不会解决&#34;信任&#34;问题
例如,包加载程序可以使用公钥维护程序集名称,并通过完整程序集名称加载程序集/程序?
<PackageHandlers>
<PackageHandler>
<Package type="Package1" assembyName="SomeAssembly" publickey="d45755dbb8b44e59" />
</PackageHandler>
</PackageHandlers>