检查给定的可执行文件是否经过数字签名且有效?

时间:2011-10-15 20:06:47

标签: c# .net cryptography code-signing authenticode

在我的C# / .NET应用程序中,我必须检查给定的可执行文件是否经过数字签名 (最好不进行Exception测试。)< / em>

然后我需要检查其证书是否有效 (基于已安装的根证书)如果文件内容对签名有效

BCL中有很多课程,我不知道从哪里开始&amp;什么用,我到目前为止发现的任何东西并没有消除我的困惑......

如果可能的话,我想做这样的事情,没有 P/Invoke

bool IsSignedFile(string path);  
Cert GetCertificateFromSignedFile(string path);
bool IsValidCertificate(Cert cert)
Sig GetSignatureFromSignedFile(string path);
bool IsValidSignature(string path, Sig sig, Cert cert);  

添加说明:

我目前遇到的一个大问题是,我找不到一种方法来轻松获取此类文件的签名。仍然希望有一个提供的,有管理的BCL解决方案,因为如果缺少这一部分,我会感到惊讶。 (对于证书,只需X509Certificate.CreateFromSignedFile即可完成,也可以验证)
我不希望将50%的工作与P/Invoke代码或一个大不同的库混合使用。

我找到了一个AuthenticodeSignatureInformation类,但没有关于为给定的可执行文件使用它的信息。

2 个答案:

答案 0 :(得分:8)

您只能使用托管代码执行此操作。 mono项目拥有自己的 signcode chktrust 工具,可让您签名并验证Authenticode(tm)签名。

两者都使用Mono.Security.dll程序集,它在Windows下运行正常,并且所有代码都是根据MIT.X11许可证授权的(因此您几乎可以随意使用它)。

但是,你需要一些额外的逻辑来检查根证书,因为Mono使用它自己的商店 - 而不是Windows上的商店。这应该不是一个大问题,因为.NET(因为v2)提供了查询/访问用户/机器证书存储的类。

免责声明: 我写了上面的大部分代码; - )

答案 1 :(得分:4)

Determining if a file has a valid digital signature使用PInvoke,以防您找不到托管解决方案