我是一名业余程序员。我创建了一个由单个自签名jar文件组成的应用程序。该应用程序将仅供我的数学课程中的学生使用,因此我认为自签名是可以的。
我按照Oracle的指示对jar进行签名,然后使用jarsigner工具验证jar。据说,没关系。
在.jnlp文件中,我包含了具有所有权限的安全标记:
<security>
<all-permissions/>
</security>
但是,当程序启动时,我从未看到提示用户接受证书的对话框或要求在客户端计算机上运行某种权限。据我的理解,根据Oracle文档,我应该看到这样的对话框。
我已经在stackoverflow上阅读了这个页面:
我有一个类似的情况,我得到一个安全例外。在我的例子中,当应用程序尝试显示filechooser对话框时抛出异常:
java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
这是因为从未要求用户提供权限。我相信我遵循了stackoverflow页面上的建议,但它似乎对我不起作用。这就像jar似乎是无符号的。我甚至尝试删除所有权限标记并获得完全相同的行为。
我查看了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的版本是罪魁祸首,我如何强制从终端(Ubuntu)运行较新版本的jarsigner?
感谢您的帮助。正如我在开始时所说,我是一名业余程序员。我真正想做的就是为下周的课程做好准备。
更新:
在使用无法找到libjli.so的jar工具挣扎了很长时间之后,我现在已成功使用1.6 jar工具和jarsigner工具,因此MYKEY.SF文件的顶部如下所示: / p>
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时,jar是用1.6创建的吗?
我不知道服务器上实际发生了多少java活动。在某些时候,它切换到客户端计算机,但我假设jnlp的一部分首先发生在服务器上。
答案 0 :(得分:3)
回答您的具体问题: