12

在我的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解决方案,因为如果这部分确实丢失了,我会感到惊讶。(对于证书,这可以通过 just 来完成,也可以X509Certificate.CreateFromSignedFile验证)
我不希望将 50% 的工作与P/Invoke代码或其他大型库混合。

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

4

2 回答 2

8

您可以仅使用托管代码来执行此操作。mono 项目有它自己的signcodechktrust工具,允许您签署和验证 Authenticode(tm) 签名。

两者都使用Mono.Security.dll程序集,该程序集在 Windows 下运行良好,并且所有代码都在 MIT.X11 许可下获得许可(所以你几乎可以用它做你想做的事)。

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

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

于 2011-10-15T20:27:06.150 回答
4

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

于 2011-10-15T20:13:09.597 回答