Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查给定的可执行文件是否经过数字签名且有效?_C#_.net_Cryptography_Code Signing_Authenticode - Fatal编程技术网

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()中的所有第一组检查,最终还是出现了一个受信任的根错误。这是签名检查中的错误吗?