我是一个业余程序员。我创建了一个应用程序,它由一个自签名的 jar 文件组成。该应用程序仅供我数学课的学生使用,所以我认为自签名是可以的。
我按照 Oracle 的说明对 jar 进行了签名,然后使用 jarsigner 工具来验证 jar。想来,还好。
在 .jnlp 文件中,我包含了具有所有权限的安全标记:
<security>
<all-permissions/>
</security>
但是,当程序启动时,我从来没有看到提示用户接受证书或请求某种权限以在客户端计算机上运行的对话框。根据 Oracle 文档,我的理解是我应该看到这样的对话框。
我在stackoverflow上阅读了这个页面:
我也有类似的情况,因为我遇到了安全异常。就我而言,当应用程序尝试显示文件选择器对话框时会引发异常:
java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
这是因为从未要求用户提供权限。我相信我遵循了该 stackoverflow 页面上的建议,但它似乎对我不起作用。就像罐子似乎没有签名一样。我什至尝试删除所有权限标签并得到完全相同的行为。
我查看了 jar 内部,可以看到其中有两个必需的文件:MYKEY.DSA 和 MYKEY.SF。我查看了可读文件 (.SF) 的内部,其中包含应该存在的文本。我相信这就是签名所需的所有罐子。
所以这是我的问题:
1) .DSA 和 .SF 文件的名称与应用程序有关吗?目前他们只有我在 keytool 中使用的别名。
2) 如果我的服务器上的 java 版本是 1.7 而我的开发计算机上的 java 版本是 1.6,这有关系吗?我需要在1.6编译,因为我们学校还没有升级到1.7,所以在客户端电脑上运行需要1.6。
3)当我从终端运行它时,有没有办法确定我使用的是哪个版本的 jarsigner?我尝试了 jarsigner -version,但这不是选项之一。我注意到 MYKEY.SF 文件的顶部如下所示:
Signature-Version: 1.0
Created-By: 1.4.2-02 (Blackdown Java-Linux Team)
SHA1-Digest-Manifest: OHMs6w/CQlG3MVYNxC7l1vTWdZw=
Name: org/arps/tranz/TranzActionMap.class
SHA1-Digest: dSI3RKfgUrRHbwnZLyXbkiJLWdU=
这是否意味着实际上有一些旧版本的 jarsigner 正在运行?我不认为 Java 1.4 还在我的计算机上。无论如何,我的 jarsigner 版本似乎创建了与此处看到的相同类型的文件:
http://docs.oracle.com/javase/tutorial/deployment/jar/intro.html
我不知道由 1.6 jarsigner 或 1.7 jarsigner 创建的文件是否看起来有什么不同,或者它是否重要。
4)如果 jarsigner 的版本是罪魁祸首,我如何强制更新版本的 jarsigner 从终端(Ubuntu)运行?
谢谢你的帮助。正如我一开始所说,我是一名业余程序员。我真正想做的就是为下周的课程做好准备。
更新:
用了一个找不到libjli.so的jar工具折腾了好久,现在已经成功使用了1.6的jar工具和jarsigner工具,这样MYKEY.SF文件的顶部是这样的:
Signature-Version: 1.0
SHA1-Digest-Manifest-Main-Attributes: DGUFMaJYirZi//67NI+M5RVi63k=
Created-By: 1.6.0_03 (Sun Microsystems Inc.)
SHA1-Digest-Manifest: ZPS3aOyPW/tymxbGdfe4/qBVK/g=
但我仍然得到相同的行为,即应用程序开始启动而不要求用户接受证书。所以现在我的主要问题是:
在我的服务器运行 1.7 时使用 1.6 创建 jar 是否重要?
我不知道服务器上实际发生了多少 java 活动。在某些时候,它会切换到客户端计算机,但我假设 jnlp 的部分内容首先发生在服务器上。