我用JApplet写一个web中的小程序,需要访问客户机本地资源,所以对包含了applet程序的jar文件做了数字签名处理,具体如下
1.keytool -genkey -keystore test.store -alias test
2.keytool -export -keystore test.store -alias spat -file test.cert
3.Jarsigner -keystore test.store test.jar test
4.做了一个policy文件applet.policy,内容如下
/* AUTOMATICALLY GENERATED ON Fri Sep 08 16:58:51 CST 2006*/
/* DO NOT EDIT */keystore "file:d:/admin/test.store", "JKS";grant signedBy "test" {
  permission java.io.FilePermission "<<ALL FILES>>", "read, write, delete, execute";
};
5.在Jre的\lib\security\目录下的java.security文件中相应的位置加了一行policy.url.3=file:d:/admin/applet.policy内容,其中:D:/admin为存放applet.policy的路径然后用JFileChooser类做了一个打开文件的对话框,如果是直接按以下处理是没有问题的
例如:
JFileChooser  fileChooser = new JFileChooser();
fileChooser. showOpenDialog();
并且用弹出的对话框,选择一个文件,还能读入内存,但如果不做数字签名,在执行new JFileChooser()的时候就报出下面错误:
Exception in thread "AWT-EventQueue-2" java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)如果做了数字签名, 调用fileChooser.addChoosableFileFilter(fileFilter)添加了文件过滤器以后,在执行fileChooser. showOpenDialog这个方法的时候,在Console中会报出下面的错误:
Exception in thread "AWT-EventQueue-3" java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)在相应的方法中,如果不弹出带有FileFilter的文件选择对话框,直接做某文件的读写也是可以的;从上面的两种错误来看,我觉得我做的数字签名还是有效的,但就是有的处理可以绕过Java虚拟机的安全沙箱,但是有的处理就不能;不知道是不是还有什么jar文件没有签名,或者其它的问题,说了这么多,想请各位大侠帮我看看具体的原因,急于求救中,还请高手不吝赐教;谢谢!

解决方案 »

  1.   

    应该是需要java.util.PropertyPermission这个权限,你只赋予了文件读些权限,但是没有获得系统属性的权限。所以
    grant signedBy "test" {
    permission java.io.FilePermission "<<ALL FILES>>", "read, write, delete, execute";
    permission java.io.PropertyPermission "user.dir" "read";
    };
      

  2.   

    我试了一下,应该是java.util.PropertyPermission吧,但还是不行,后来我把这个policy文件中所有的权限都删除,包括java.io.FilePermission的所有权限也删除掉,发现还能读写本地文件,数字签名其他的仍然都做了,感觉这个policy文件没有起作用,或者是我做签名的时候,什么地方做错了?大家都来帮忙想想办法吧,谢谢了,虽然还没搞定,还是非常谢谢elan,继续帮我看看吧!
      

  3.   

    我试了一下,直接在jre的lib下的java.policy文件中加了一行permission java.util.PropertyPermission "user.dir", "read";就可以了,不过感觉这个办法不太好,如果能用自己的applet.policy就更好了,谢谢,接分!
      

  4.   

    elan,不好意思啊,分一定会给你的,但是给了分就结了帖,我主要是想再看大家能不能还有点好的建议,后面的哥们,谁能给点意见啊,但是可能不能给分了,谢谢大家了!