【问题标题】:.NET - How to force an assembly digital certificate validation when referenced from another assembly.NET - 从另一个程序集引用时如何强制程序集数字证书验证
【发布时间】:2015-03-18 12:59:37
【问题描述】:

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

为了生成证书,我使用了 makecert 工具创建了一个自定义授权,然后在这篇文章之后创建了一个由该授权签署的客户端证书: http://www.digitallycreated.net/Blog/38/using-makecert-to-create-certificates-for-development

之后,使用 signtool.exe 对 pfx 文件签名 dll。

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

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

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

我尝试对 dll 进行强命名,但效果很好。问题在于强命名更多的是一种版本完整性解决方案,而不是真正的安全措施。

我的问题是:如何强制 exe 始终检查 dll 的证书,以便如果 dll 被篡改,我会收到运行时错误,说明发布者无效或类似情况。

【问题讨论】:

  • 为什么强命名对你不起作用?如果被篡改,强名会不一样,所以exe不能运行。如果攻击者有足够的权限来更改/重建被篡改的 dll 的 exe,那么他们也有足够的权限从您的 exe 中删除对有效证书的检查
  • 对,问题是我可以找到许多使用 ildasm、ilasm 和任何时间的十六进制编辑器删除强名称验证的示例。我在使用证书时找不到这样的证书,所以我认为不可能如此轻松地实现相同的目标。您确定即使使用数字签名,也可以将 exe 和 dll 都格式化为与“邪恶”代码一起工作?有什么资料可以证明吗?
  • 签名只是向最终用户证明文件的来源。它不会阻止它被反编译、更改和重新编译等。您的最终用户(使用 Windows)将能够检查证书,但如果有人可以访问 exe 和 dll,它们都可以更改
  • 感谢 Jeams,这是有道理的。只是出于好奇-强命名仅针对公钥进行验证。如果我还想验证 dll 的供应商怎么办?证书是否仅用于手动最终用户检查下载的代码是否可信?您对您的建议很有帮助,但如果有可能以与强名称公钥相同的方式自动检查证书,我没有得到答案?
  • 我确信可能有一种方法可以检查/验证签名证书,但我从来没有这样做过。我的观点是,如果有人有权更改 dll,他们(可能)也有权更改 exe - 他们也可以更改/删除证书检查代码,这就是为什么我不确定它是否能给你更多保护比强命名。他们不能做的是使用声称来自您的证书重新签名(假设在某些时候您从全球受信任的根 CA 获得签名证书),但如果您的用户不看,他们不会看看有什么不同。

标签: c# .net security digital-signature strongname


【解决方案1】:

不应将强命名用于完整性检查。 .NET 程序集加载器不再验证强名称程序集的完整性(从 .NET 3.5 SP1 开始)。

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

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

【讨论】:

  • 好的,但是当我尝试以下操作时: 1.强命名 dll 2.从 exe 中引用它 3.构建另一个没有强名称的 dll 并覆盖旧的 4.运行 exe 5.An抛出清单不匹配的异常。这是我所期待的行为。检查强名称并捕获该 dll 格式错误。你能澄清一下吗?
猜你喜欢
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多