Java JNLP 要求签名的目的是什么?

3
我对安全基础知识和数字签名等内容的了解有限。例如,我了解数字签名在公钥加密中的用途。然而,我不明白为什么需要签署我的JNLP文件,以及它可以防范哪些恶意行为,也找不到相关信息。
我发现可以部署未签名的JNLP文件,但是磁盘和网络访问等功能受到限制。然而,假设我是一个恶意人员,制作了一款Java应用程序,会对您磁盘上的内容进行恶意攻击(并将其伪装成其他东西)。我可以轻松地对此进行签名、部署,并且您可能会毫无戒心地访问我的网站,启动该应用程序并遭受磁盘攻击。在这种情况下,签名有何用处?
更重要的是,如果任何人都可以轻松地签署应用程序,那么还有什么意义呢?
我相信我错过了某些非常显而易见的事情,请给我指点迷津。
2个回答

4
你不能仅仅签署某个东西 - 如果你想让浏览器无限制地执行它的话。用于签署软件的证书必须使用另一个证书进行签名,以此类推,直到信任链达到已在您的浏览器中安装的根证书
虽然有一些不够勤勉的证书颁发机构,但通常情况下,您无法获得这样的证书,除非提供一些关于您(网络)身份的证明。这意味着恶意人士必须提供某种形式的身份证明,尽管可能很少。更重要的是,预期证书颁发机构吊销已被用于恶意活动或被攻击的证书,从而限制暴露的范围。
如果您在网站中使用CA签名的证书,并且该证书用于分发恶意软件,那么CA会很快撤销您的证书。另一方面,如果您使用自签名的证书,则浏览器将要求用户确认其使用。如果用户尽管收到警告仍然继续使用,那么这是他们自己的责任,不是吗?毕竟,对于愚蠢或无知,没有普遍的对策...

1
“限制未签名应用程序到沙盒的意义是什么?” 作为终端用户,我不想被提示接受可能会抹掉我的磁盘并将我的个人数据上传给其他人的代码。没有提示是这种(未签名)小程序无法造成任何伤害的很好的迹象。我认为在这里考虑“自签名”的代码没有帮助。自签名的代码不应进入生产环境。 - Andrew Thompson
@AndrewThompson 我猜这取决于你所说的“投入生产”的含义。我见过一些非常成功的开源项目,在其网页上使用自签名的JNLP(例如JOSM)。要求他们自签名应用程序,以便他们的成千上万的用户可以使用它似乎有些愚蠢...因为自签名本身并不能证明什么。用户使用它是因为他们信任发布者。我不确定考虑这种情况有什么不好。作为一个新开源应用程序的开发者,自签名是我JNLP的唯一真正选择。我负担不起更高级的东西。 - Dave Johnson
1
我见过很多非常成功的开源项目在他们的网页上使用自签名的JNLP。但这并不意味着这是一个好主意。请注意,我也提供许多“自签名”应用程序,但正如我所说,它们确实应该使用有效证书进行签名。如果此类证书价格合理,我的应用程序将使用它们。你的应用程序到底是做什么需要信任? - Andrew Thompson
@AndrewThompson 嗯,看起来我错了,我的应用程序不需要自签名也可以工作。糟糕。我的困惑仍然存在。一个通过Web点击的JNLP可能需要签名,但是当下载相同的JAR时,即使没有任何签名,它仍然可以正常运行,这似乎很奇怪。我想也许是因为人们合理地期望Web链接不会像下载的程序文件那样具有相同的特权。 - Dave Johnson
1
一个应用程序是否能在沙盒中正常运行,实际上取决于它尝试做什么。例如,如果它需要访问本地磁盘或联系不是“主服务器”的站点,则需要信任。 - Andrew Thompson
显示剩余5条评论

1
这个问题确实提出了一些有价值的观点,thkala为来自可信任机构颁发的CA的价值提供了良好的防御。
但是为什么我们需要为JNLP而不是普通的可执行JAR文件使用CA呢?我认为原因是JNLP旨在从浏览器中启动。 JNLP文件是在沙箱中运行在浏览器内部的小程序(applets)的替代品 - 理论上受保护,不会对您的计算机造成任何损害。用户可以通过访问页面来启动在小程序中运行的jar文件。同样,可以通过单击按钮启动JNLP。在Chrome中,我被要求先保存JNLP。但是在IE或Firefox中,我看到一个启动按钮或常规的网页链接 - 它看起来像网页中的任何其他按钮或链接 - 单击即可运行程序。这比下载可执行文件然后运行它更加无缝。
另一方面,可执行JAR文件可以通过多种方式安装或运行。例如,它们经常与MRI一起打包在CD上,因为一些MRI查看软件在JVM上运行,患者或医生需要启动定制软件来查看MRI。但是此软件不会被“安装”。您只需从CD上运行它即可。
另一方面,JNLP更像是安装程序而不是独立的程序。我已经能够让它们创建桌面快捷方式并进行文件关联。从用户的角度来看,我的JNLP应用程序感觉像是具有自己的图标和文件类型的本地程序。由于它可以从浏览器无缝运行并具有对客户端PC的无限制访问权限,因此将其“签名并信任”可以使用户在运行此程序时感到更加安全。
从历史上看,我认为这就是为什么JNLP和小程序需要签名的原因。我认为这种签名的实际价值已经过期。 首先,从CA签署应用程序的成本高达数百美元,因此许多公司会跳过此步骤。有一些企业应用程序会运行自签名代码,用户只需在浏览器发出警告后点击“接受”按钮即可。
更重要的是,最近针对Java的安全更新主要集中在修补后门,这些后门允许未签名代码走出沙箱并执行与已签名applet或JNLP相同的所有操作。似乎每当Oracle修补沙箱中的一条出路时,就会有人找到另一条出路。最好的解决方案是使运行时始终提示用户是否允许运行Java applet或JNLP文件。不仅自签名的JNLP文件可以访问本地文件系统和局域网,未签名的JNLP也可以。如果用户安装了来自Oracle的最新安全更新(当然,大多数用户没有),并且在下一个巧妙的走出沙箱的方法被发现之前,那么沙箱模型真正发挥了预期的作用。但对于大多数用户,大部分时间,沙箱模型并没有按照预期工作。我认为现在是所有JNLP文件都要求运行并给予它们与常规JAR文件相同的访问权限的时候了。

那样我就不必每6个月重新创建我的安全证书了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接