C# .NET-如何在从另一个程序集引用时强制程序集数字证书验证

C# .NET-如何在从另一个程序集引用时强制程序集数字证书验证,c#,.net,security,digital-signature,strongname,C#,.net,Security,Digital Signature,Strongname,我有一个引用程序集(.dll)的可执行文件(.exe)。我已使用自签名证书对dll进行签名 为了生成证书,我使用makecert工具创建了一个自定义机构,然后在下面的帖子中创建了一个由该机构签名的客户端证书: 之后,使用signtool.exe将dll重新签名为pfx文件 当我右键单击dll时,我可以看到“数字签名”选项卡,检查证书的详细信息并确认它在我的计算机上有效,因为我已将自定义根权限添加到受信任的权限存储 dll复制到exe的bin/debug目录中 我的主要目标是确保从exe引用的d

我有一个引用程序集(.dll)的可执行文件(.exe)。我已使用自签名证书对dll进行签名

为了生成证书,我使用makecert工具创建了一个自定义机构,然后在下面的帖子中创建了一个由该机构签名的客户端证书:

之后,使用signtool.exe将dll重新签名为pfx文件

当我右键单击dll时,我可以看到“数字签名”选项卡,检查证书的详细信息并确认它在我的计算机上有效,因为我已将自定义根权限添加到受信任的权限存储

dll复制到exe的bin/debug目录中

我的主要目标是确保从exe引用的dll是我们已认证的有效dll。它有合适的供应商、版本等

我已经尝试强名称的dll和它的工作良好。问题在于,强命名更像是版本完整性解决方案,而不是真正的安全措施


我的问题是:如何强制exe始终检查dll的证书,这样,如果dll被篡改,我将得到一个运行时错误,解释发布服务器无效或类似的情况。

不应使用强命名进行完整性检查。.NET程序集加载器不再验证强名称程序集的完整性(自.NET 3.5 SP1以来)

但是,您可以通过配置重新启用此功能。如果要防止在磁盘上修改程序集,应使用


这篇文章和这篇文章更深入地描述了这些变化。

为什么strong命名不适合您?如果被篡改,strong名称将不同,因此exe将无法工作。如果攻击者有足够的权限针对被篡改的dll更改/重建exe,他们就有足够的权限删除对exe中有效证书的检查。问题是,我可以找到许多使用ildasm、ilasm和任何时间的hex editor删除强名称验证的示例。我在使用证书时找不到这样的证书,因此我认为不可能如此轻松地实现同样的目标。您确定即使在使用数字签名的情况下,exe和dll的格式都可能不正确,从而与“邪恶”代码一起工作吗?是否有任何来源可以证明这一点?签名只是向文件来源的最终用户证明。它不会阻止对其进行反编译、更改和重新编译等。您的最终用户(使用windows)可以检查证书,但如果有人同时访问exe和dll,则可以对其进行更改Hanks Jeams,这是有意义的。仅出于好奇-强命名仅针对公钥进行验证。如果我还想验证dll的供应商,该怎么办?证书是否仅用于手动最终用户检查下载的代码是否可信?您的建议对我很有帮助,但我没有得到答案,是否可以以与强名称公钥相同的方式自动检查证书?我相信可能有一种方法可以检查/验证签名证书,但我从未这样做过。我的观点是,如果有人有权更改dll,他们(可能)也有权更改exe-他们也可以更改/删除证书检查代码,这就是为什么我不确定它是否比强命名提供更多的保护。他们不能做的是用声称来自您的证书重新签名(假设在某个时候您从全球受信任的根CA获得签名证书),但是如果您的用户不看,他们不会看到任何差异。确定,但当我尝试以下操作时:1.强名称dll 2.从exe引用它3.构建另一个没有强名称的dll并重写旧dll 4.运行exe 5.引发清单不匹配的异常。这就是我所期待的行为。已检查并捕获强名称,以确定dll的格式不正确。你能澄清一下吗?