任何错误的不签署一个.NET程序集?
我的一个同事非常热衷于签署集会。 他从字面上试图签署任何东西。 即使我们使用Microsoft没有签名的程序集,他也会拿到源代码,签名,然后要求其他开发人员使用他的副本。
我可以理解签署大会背后的基本理念:确保某个特定的程序集不会被一些狡猾的黑客入侵。 所以如果我们是一个软件开发公司,我们应该在向客户发布.NET库之前签署我们的程序集。
不过,我们主要是为了我们自己的使用而开发Web应用程序,而我不能看到我们使用的每个程序集的签名。
我在这里错过了什么?
对可信环境中使用的程序集进行签名听起来对我来说太过分了。
在签名程序集上的一个有趣的地方是,它们比未签名的程序集加载稍慢,因为它们必须经过encryptionvalidation。
为了签署一个议会,它所依赖的任何议会也必须签署。 我的猜测是,这有助于您的同事签署一切的愿望 – 编译器要求它。
编辑自写这个答案,你可以看到亲和反对阵营大致相当的支持。 这里显然没有正确的答案。
强迫这个编辑的一点是,现在我们从NuGet中拿走了这么多的开源库,其中很多根本没有签名。 如果你想签署你的程序集,你也需要签署任何依赖关系。 许多已签名的开放源代码库都有用于在其源代码库中公开可用的私钥。
就像所做的一切都有所取舍。 根据我在私人环境中工作的经验,签名的好处大多是理论上的(或学术的,如@ user289100提到的),除非你担心政府机构修改你的代码,在这种情况下,你需要对如此多层次的您签署的基础架构看起来像是一点点努力。 否则,不得不签署一切的挑战,似乎并不值得。 然而,你的环境可能有不同的要求,或者你可能是一个受虐狂!
另请参阅Teun D的答案 ,了解使用强名称时与版本控制相关的挑战。
我已经利用未签署的程序集来解决问题,并在学术环境中向人们展示了为什么它很重要。 我用一个名字相同的签名replace了一个没有签名的DLL文件(再次在学术设置中),并使用.NET Reflector来复制和粘贴原始代码,但在我的电子邮件中,我发送了用户名和密码在调用“真实”代码之前被传入。
如果已签名,则可以进行签名匹配,但不能replace。 与Zippy说的相反,会有一个运行时错误。
签署程序集永远不会矫枉过正。 这需要30秒。 这就好像说你住在这个国家的时候,锁上你的门就是过火了。 如果你想用自己的财物进行赌博,请继续,保持开放。 只有一个安全漏洞被解雇。 只需要30秒钟的时间签署一个大会,没有商业案例不能。 性能影响是可以忽略的。
还有一点:签名你的程序集会破坏版本的向后兼容性。 您的参考文献都开始包含版本号,其他版本号的版本被认为是不兼容的。 这阻碍了升级到更新版本的分布式程序集。
在我看来,如果你看到一些具体的收益,你只应该对程序集进行代码签名:
- 如果您部署到不受信任的人可能会触摸您的程序集的环境
- 在某些插件模型中,您希望使用该证书作为升级信任的证据
- 如果你的代码应该可以从其他的签名代码中调用(像log4net这样的项目,他们的代码是可以被广泛使用的;他们几年前失去了秘密密钥,因此他们的代码签名是另一个风险) 。
- 如果你想部署到GAC
你的同事有没有给你任何迹象说明他为什么喜欢签署议会? 签署这个协议的一个好处是没有在这里讨论,只有签署的程序集可以放在GAC中(即在被pipe理的进程中共享),但是缺点似乎超过了我(从经验不足的angular度)的好处。
关于自签名微软代码的轶事对我来说似乎特别令人怀疑。 如果MS没有签署代码,可能有一个原因,对吧? 通过签名,当你没有写出来的时候,你要承担责任 – 这是将来咬你的另一个机会。
另外一个关于签署集会的事情是,那个人不能把不正确的一个代替你的(也是你自己的意外)。 例如,如果您创build一个引用程序集Foo.dll 1.0版的程序,则可以使用相同的版本创build程序集并replace您的程序集,而在签署程序库时则不可能(在至less我不认为这很容易)。
只有将程序集放在GAC中时,签名才是必需的。 签名的程序集不会阻止别人惹他们。 黑客仍然可以剥夺签名和任何其他代码来检查签名。
我同意这似乎有点浪费。 确实需要确保文件是您认为的文件(并且没有被篡改)。 但是,如果您信任自己的networking安全和Web服务器的范围,那么签署您的Web程序集似乎是一个冗余的步骤。
但也许这是我的小企业经验谈话。 如果你正在谈论一个关键任务的在线银行网站,那就去签名吧。
想想如果你要运送一些东西和/或实际上有一个这样做的理由这样做。 在其他情况下,这只是麻烦。 我会问你的同事他究竟是怎么做到的。
我以前遇到过签名的程序集,这是后面的一个痛苦,特别是当你考虑到签署程序集时知之甚less,以及如何去做的人数。 除非绝对必要,否则这是另一件你不应该关心的问题。
在用于从Web部署ClickOnce XBAP的过程中,您需要对程序集进行签名。
另外,所有引用的程序集也需要被签名。
我们签署我们的程序集是因为有些时候我们得到像下面这样的错误(这是来自testing,但是在运行应用程序时可能发生):
System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
我们发现Visual Studio有时会错误地 运行旧代码 。
如果您在运行旧代码时想要出现错误,请为您的程序集签名。
如果您正在编写nuget包, 请在您的程序集上签名 。 未签名的程序集对于希望确保我们正在运行最新版本的代码的用户来说是尴尬的。 我无法修复Visual Studio 。 我所能做的就是检测到Visual Studio错误。 所以请签署你的nuget程序集 。