签名Java小程序犯规获得权限在Safari(Signed Java applet doesnt g

2019-09-21 15:38发布

我有一个签名的Java小程序(使用自签名证书),具有访问用户的文件系统。 我必须这样做,所以请无回复ALA“你不应该做” :)

问题是,当我从Firefox 3.0执行的Applet / Mac上,一切正常需要,我得到的所有访问,就像它应该。

当我使用萨法尔4 / Mac上,我没有得到访问。 该行我特别有是System.getProperty()的问题(虽然我存根说出来,对FS的访问也不起作用)

String home = System.getProperty("user.home");

我得到的异常如下:

java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
at java.lang.System.getProperty(System.java:628)
at de.samedi.searcher.Searcher.<init>(Searcher.java:49)
at de.samedi.searcher.Applet.getSearcher(Applet.java:193)
at de.samedi.searcher.Applet.getSearcher(Applet.java:187)
at de.samedi.searcher.Applet.addPatient(Applet.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.plugin.javascript.invoke.JSInvoke.invoke(JSInvoke.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.plugin.javascript.JSClassLoader.invoke(JSClassLoader.java:44)
at sun.plugin.liveconnect.PrivilegedCallMethodAction.run(SecureInvocation.java:658)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation$2.run(SecureInvocation.java:214)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.liveconnect.SecureInvocation.CallMethod(SecureInvocation.java:192)
at sun.plugin.liveconnect.SecureInvocation.access$300(SecureInvocation.java:52)
at sun.plugin.liveconnect.SecureInvocation$CallMethodThread.run(SecureInvocation.java:123)

正如我所说的,这完美的作品在Firefox。 应该看看今天的Windows浏览器...

有任何想法吗?

Answer 1:

一旦你有你的jar编译并签署您应该运行-verify选项,以确保其正确签名。

如果验证是确定一下你的浏览器安装的证书。 我没有在Safari只有IE浏览器做任何事情,但我想还有类似IE,你至少可以查看已安装的证书的地方。 我会验证证书安装。

另外,请确保您的代码在特权块运行。

 String home = System.getProperty("user.home");

总是会抛出一个错误,在1.4或更高版本。 除非您编辑java.policy文件的所有权限

尝试结合使用这与您签署的罐子。

 String home = (String) AccessController.doPrivileged(new PrivilegedAction() 
 {
      public Object run() 
      {
     return System.getProperty("user.home");
      }
 });


Answer 2:

拥有了用户接受的完全访问为在Safari您的小程序? 听起来像安全管理器中踢。



Answer 3:

我记得有在旧版本的Safari浏览器的一个类似的问题(这是几年前),我找到了解决办法是将延迟到小程序。 这似乎Safari浏览器由于某种原因被允许用户被赋予了“信任这个小程序”对话框(其他浏览器将无法启动小程序,直到之后的用户授予或拒绝访问)之前的小应用程序来运行。 此时小程序不被信任,并会出现一个安全异常。 即使用户将然后让信任,这是为时已晚的小程序已经运行和失败。 我不得不添加一个延迟Safari浏览器,所以它不会尝试做任何需要的安全访问,直到一段时间已经过去了,允许用户提供访问小程序试图做任何需要的安全访问之前。



文章来源: Signed Java applet doesnt get permissions in Safari