使用appletviewer签署jar抛出权限异常

时间:2012-01-12 23:47:50

标签: java applet jar-signing signed-applet appletviewer

我正在尝试解决签名的jar无法在appletviewer下工作的问题。我的主要目标是在浏览器之外运行它,所以我尝试使用appletviewer - 如果您有其他建议,请告诉我。

以下是上下文:

  • Ubuntu 11.10
  • 爪哇:

    $ java -version
    java version "1.6.0_26"
    Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
    Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
    

问题在于:

  • 我有一个包含内部小程序的jar myjar.jar
  • 它在浏览器中正常运行,但在appletviewer
  • 下运行时却无效
  • 罐子已签名:

    $ jarsigner -verify -certs -verbose -keystore /etc/ssl/certs/java/cacerts myjar.jar
    ...
    smk     <file size> <file date> <file name>
    
          X.509, CN=xxx, OU=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          X.509, CN=yyy, OU=yyy, OU=yyy, O=yyy, C=yyy
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          [KeyUsage extension does not support code signing]
          X.509, OU=zzz, O=zzz, C=zzz (alias1)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
    ...
    jar verified.
    

并且,虽然中间签名证书(上面的yyy)不存在,但根目录(zzz - 或alias1)是:

$ keytool -list -v -keystore /etc/ssl/certs/java/cacerts -storepass changeit|grep alias1
alias1, Mmm d, yyyy, trustedCertEntry,

运行此:

$ appletviewer myhtml.html

给出:

Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission preferences)

问题集1:

  • 假设当存在根证书时,假定所有后续中间证书都可以用于验证目的吗?在上面的情况下,是否有必要在cacerts文件中使用yyy?
  • 当jar被签名时,就像myjar.jar一样,是否认为appletviewer应该没有限制地运行?
  • 有没有更好的方法来运行它来避免这种情况?
  • 为什么浏览器的工作方式与appletviewer不同?

不确定上述内容,我尝试将证书添加到另一个名为cacerts2的本地文件中。我可以证实:

  • keytool在cacerts中列出该证书
  • jarsigner输出现在是这样的:

    $ jarsigner -verify -certs -verbose -keystore cacerts2 myjar.jar
    ...
    smk     <file size> <file date> <file name>
    
          X.509, CN=xxx, OU=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          X.509, CN=yyy, OU=yyy, OU=yyy, O=yyy, C=yyy (alias2)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          [KeyUsage extension does not support code signing]
          X.509, OU=zzz, O=zzz, C=zzz (alias1)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
    ...
    jar verified.
    

请注意,现在我在输出中存在中间别名(yyy - 或alias2),并对alias1和alias2进行了验证。像这样运行appletviewer:

$ appletviewer -J-Djavax.net.ssl.trustStore=cacerts2 -J-Djavax.net.ssl.trustStorePassword=changeit myhtml.html

仍会导致相同的异常。

问题集2:

  • 以上是提供信托商店的正确方法吗?
  • 以上是否表示appletviewer将以与jarsigner相同的方式使用它 - 当传递-keystore命令用于验证目的时?

我尝试的第三件事是制作这样的政策文件(这是在mypolicy.policy中):

keystore "cacerts2";
// Tried with this and without the next line:
//keystorePasswordURL "cacerts.pass";
// where file cacerts.pass has only "changeit" / "changeit\n" in it (tried both)

// Tried the following three:
grant signedBy "alias1" {
//grant signedBy "alias2" {
//grant {
  permission java.lang.RuntimePermission "preferences";
};

并按此运行:

$ appletviewer -J-Djava.security.policy=mypolicy.policy myhtml.html

并且像这样:

$ appletviewer -J-Djavax.net.ssl.trustStore=cacerts2 -J-Djavax.net.ssl.trustStorePassword=changeit -J-Djava.security.policy=mypolicy.policy myhtml.html

结果:

  • 授权没有任何signedBy规范工作,所以我可以确认该政策被拿起
  • 使用signedBy的授权失败

问题集3:

  • 这是指定policy和signedBy的正确方法吗?我发现Oracle的文档在此主题上不完整
  • 是否在jar签名时使用了策略文件?
  • 还有其他想法吗? :)

1 个答案:

答案 0 :(得分:3)

  

我的主要目标是在浏览器之外运行它,..

使用Java Web Start,可以在1.2天左右启动applet自由浮动。 (或者将代码转换为框架。)

如果要测试的主要内容,您可以尝试Appleteer。 AFAIR我从来没有为它实现一个沙盒(所以即使是未签名的applet代码也会表现得像它一样可信)。


AppletViewer 使用启动没有安全沙箱的applet,即使它们没有签名。现在它是相反的并且有一个沙盒,并且没有办法让它接受签名的代码作为信任!

IDE似乎将一个策略文件应用于查看器,以便让用户配置IDE。