我有一个签名的java applet(使用自签名证书),它必须访问用户的文件系统。我必须这样做,所以请不要回复“你不应该这样做”:)
问题是,当我从Firefox 3.0 / Mac执行Applet时,一切都按预期工作,我得到所有访问权限。
当我使用Safar 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浏览器......
任何想法?
答案 0 :(得分:2)
一旦您的jar被编译并签名,您应该运行-verify选项以确保其正确签名。
如果验证正常,请查看浏览器上已安装的证书。 我在Safari只有IE中没有做过任何事情,但我想有一个类似于I.E.的地方。您至少可以在其中查看已安装的证书。我会验证证书已安装。
还要确保您的代码在特权块中运行。
String home = System.getProperty("user.home");
总是会抛出1.4或更高的错误。除非您为所有权限编辑了java.policy文件
尝试将此与已签名的jar结合使用。
String home = (String) AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
return System.getProperty("user.home");
}
});
答案 1 :(得分:0)
用户是否已接受Safari中applet的完全访问权限?听起来像是安全经理。
答案 2 :(得分:0)
我记得在旧版本的Safari(这是几年前)中遇到了类似的问题,我找到的解决方案是给applet增加了延迟。似乎Safari出于某种原因允许applet在用户被给予“信任此applet”对话之前运行(其他浏览器在用户被授予或拒绝访问之前不会启动applet)。此时applet不受信任,并且会发生安全异常。即使用户随后允许信任,但由于applet已经运行并且失败,因此为时已晚。我不得不为safari添加一个延迟,因此它不会尝试做任何需要安全访问的事情,直到一段时间过去,允许用户在applet尝试做任何需要安全访问的事情之前提供访问权。