44

为什么要签署我的 JAR 文件?

我知道我需要对我的客户端 JAR 文件(包含 Applet)进行签名,以便可以完成文件系统访问等特殊操作,并且不会显示窗口底部令人讨厌的部分,但为什么会这样呢?我是否需要对包含 Servlet 等的服务器端 JAR 文件进行签名?

一些关于何时和何时不签署 JAR 的基本规则将不胜感激 - 谢谢!

4

4 回答 4

40

简短的回答 - 不要,除非您的公司政策强迫您这样做。

长答案
签名罐子实际上是在告诉您的客户“这是我做的,我保证它不会弄乱您的系统。如果确实如此,请来找我报仇”。这就是为什么从远程服务器(applet / webstart)部署的客户端解决方案中的签名jar比非签名解决方案享有更高的特权。

在服务器端解决方案上,您不必安抚 JVM 安全需求,这种保证只是为了让您的客户高枕无忧。
签名 jar 的坏处是它们的加载速度比未签名的 jar 慢。慢多少?它受 CPU 限制,但我注意到加载时间增加了 100% 以上。此外,补丁更难(你必须重新签名 jar),类补丁是不可能的(单个包中的所有类必须具有相同的签名源),并且拆分 jar 成为一件苦差事。更不用说您的构建过程更长,并且正确的证书需要花钱(自签名几乎没用)。

因此,除非您的公司政策强制您这样做,否则不要在服务器端对 jar 进行签名,并将常用 jar 保存在签名和未签名版本中(签名转到客户端部署,未签名转到服务器端代码库)。

于 2009-06-09T07:14:08.647 回答
2

一个很好的理由可能是,如果您从不希望任何人能够潜入修改后的类以由您的代码调用。

不幸的是,这包括你自己 :-D 所以只有在你真的需要时才这样做。检查“密封罐”的概念。

于 2009-06-09T07:36:44.093 回答
1

签署一个 jar 文件,就像在其他上下文中使用证书一样,这样做是为了让使用它的人知道它来自哪里。人们可能相信 Chris Carruthers 不会编写恶意代码,因此他们愿意允许您的小程序访问他们的文件系统。签名为他们提供了一些保证,即罐子确实是由您创建的,而不是由冒名顶替者或他们不信任的人创建的。

在服务器端或库 jar 的情况下,通常不需要向任何人提供这种保证。如果它是您的服务器,那么您就知道您正在使用什么 jar 以及它们来自哪里,并且您可能相信自己的代码不是恶意的。

于 2009-06-09T07:12:19.230 回答
1

在小程序方面:从 6u10 开始,Sun JRE 将警告横幅替换为不那么显眼的(从 6u12,IIRC 开始)警告三角形(支持成形和透明窗口所必需的)。6u10 还允许通过 JNLP 服务 API 访问受控文件。

最小特权原则说你不应该签署你的 jar 文件的类。安全不一定容易。

简单地显示证书对话框不应被解释为意味着网页的全部内容都是可信的。

于 2009-06-09T08:13:06.797 回答