C# 检查给定的可执行文件是否经过数字签名且有效?
在我的C# 检查给定的可执行文件是否经过数字签名且有效?,c#,.net,cryptography,code-signing,authenticode,C#,.net,Cryptography,Code Signing,Authenticode,在我的C#/.NET应用程序中,我必须检查给定的可执行文件是否经过数字签名(最好没有异常测试) 然后我需要检查其证书是否有效(基于已安装的根证书),以及文件内容是否对签名有效 在BCL中有这么多的类,我不知道从哪里开始&使用什么,到目前为止我发现的任何东西都不能消除我的困惑 我想这样做,如果可能的话,不使用p/Invoke: bool IsSignedFile(string path); Cert GetCertificateFromSignedFile(string path); bool
C#
/.NET
应用程序中,我必须检查给定的可执行文件是否经过数字签名(最好没有异常
测试)
然后我需要检查其证书是否有效(基于已安装的根证书),以及文件内容是否对签名有效
在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
解决方案,因为如果确实缺少该部分,我会感到惊讶。(对于证书,也可以通过验证来完成此操作)我不希望将50%的工作与
P/Invoke
code或一个大的不同库混合在一起
我发现了一个类,但没有关于对给定可执行文件使用该类的信息。如果找不到托管解决方案,请使用PInvoke,您可以仅使用托管代码执行此操作。mono项目有自己的和工具,允许您对Authenticode(tm)签名进行签名和验证 两者都使用在Windows下运行良好的程序集,并且所有代码都是在MIT.X11许可证下授权的(因此,您几乎可以使用它做任何您想做的事情) 但是,您需要一些额外的逻辑来检查根证书,因为Mono使用它自己的存储,而不是Windows上的存储。这应该不是什么大问题,因为.NET(因为v2)提供了查询/访问用户/计算机证书存储的类
免责声明:上面的大部分代码都是我写的;-) 可能重复的我希望这不会重复一个未回答的问题;)根据我所看到的,这个问题有三个答案。(没有一个被接受,但这并不是说它们不相关)。还有另外一个类似的例子,但不幸的是,所有这些都指向需要使用p/invoke。这些答案是“解析其他工具的输出”和“使用平台调用”。这个主题有一个巨大的挑战,最坏的情况是不使用它。@ordag:我发现的大多数解决方案都使用P/Invoke。我可以问你为什么不想吗?@poupou不知道如何使用Mono.Security.dll获取除reason 6之外的任何内容。即使查看代码,如果调用IsTrusted()或者在设置文件名后验证签名还没有原因,它也只能得到原因6。问题是,我知道我正在测试的一个文件有一个无效的签名,但它不知何故通过了CheckSignature()中的所有第一组检查,最终还是出现了一个受信任的根错误。这是签名检查中的错误吗?