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


在我的 C#/.NET 申请我必须 检查给定的可执行文件是否经过数字签名  (最好没有 Exception 测试)。 

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

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

我想做这样的事情,   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 class,没有关于为给定可执行文件使用它的信息。


2774
2017-10-15 20:06


起源

可能重复 stackoverflow.com/questions/7622732/... - DeCaf
我希望这不会是一个没有回答的问题的重复;) - ordag
我所看到的问题有三个答案。 (他们都没有被接受,但这并不是说它们不相关)。还有一个类似的 stackoverflow.com/questions/301024/... 但遗憾的是,所有内容都指向使用p / invoke。 - DeCaf
这些答案是 “解析其他工具的输出” 和 “使用平台调用”。有一个巨大的 命名空间 对于那个话题,最坏的情况是不使用它。 - ordag
@ordag:我发现的大多数解决方案都使用P / Invoke。我可以问你为什么不想这样做? - Rob


答案:


您只能使用托管代码执行此操作。单声道项目有它自己的 signcode 和 ChkTrust将 允许您签名和验证Authenticode(tm)签名的工具。

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

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

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


8
2017-10-15 20:27



谢谢,我要调查一下...... - ordag
@poupou使用Mono.Security.dll无法弄清楚如何获得除了原因6之外的任何东西。即使查看代码,如果调用IsTrusted(),或者在设置FileName后验证签名还没有原因,它应该只得到原因6。问题是,我知道我正在测试的文件具有无效的签名,但它以某种方式传递了CheckSignature()中的所有第一组检查,并最终以受信任的根错误结束。这是签名检查中的错误吗? - BrutalDev


确定文件是否具有有效的数字签名 如果找不到托管解决方案,请使用PInvoke


4
2017-10-15 20:13