各位大侠我通过如下已为applet做好了签名#建立签名仓库
keytool -genkey -keystore test.keystore -alias test
#导出公钥
keytool -export -keystore test.store -alias test -file test.cert
#签名jar包
jarsigner -keystore test.keystore test.jar test
#为客户端导入公钥
keytool -import -alias test -file test.cert -keystore cacerts
Applet代码如下:package cn.gwssi.app.message.applet;import java.applet.*;
import java.io.*;public class MessageApplet extends Applet {

private static final long serialVersionUID = 1L; public void loadFile(String fileName) {
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String context = new String();
while ((context = reader.readLine()) != null) {
System.out.println(context);
}
reader.close();
} catch (IOException ie) {
ie.printStackTrace() ;
} catch (SecurityException se) {
se.printStackTrace() ;
}
}

}
HTML调用代码如下:<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建网页 1</title>
</head>
<script language="JavaScript">   
function test(){   
       demo.loadFile('c:/111.txt') ;
}   
</script>
<body>
<object
id="demo"
    classid = "clsid:CAFEEFAC-0015-0000-0012-ABCDEFFEDCBA"
    codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5_0_12-windows-i586.cab#Version=5,0,120,4"
    WIDTH = 600 HEIGHT = 600 >
    <PARAM NAME = CODE VALUE = "cn.gwssi.app.message.applet.MessageApplet" >
    <PARAM NAME = CODEBASE VALUE = "." >
    <PARAM NAME = ARCHIVE VALUE = "test.jar" >
    <param name = "type" value = "application/x-java-applet;jpi-version=1.5.0_12">
    <param name = "scriptable" value = "false">    <comment>
<embed
            type = "application/x-java-applet;jpi-version=1.5.0_12" \
            CODE = "cn.gwssi.app.message.applet.MessageApplet" \
            JAVA_CODEBASE = "." \
            ARCHIVE = "test.jar" \
            WIDTH = 600 \
            HEIGHT = 600
    scriptable = false
    pluginspage = "http://java.sun.com/products/plugin/index.html#download">
    <noembed>
            
            </noembed>
</embed>
    </comment>
</object>
<form method="POST" action="--WEBBOT-SELF--">
<p><input type="button" value="test" name="B3" onclick=test()></p>
</form>
</body></html>
APPLET日志如下:
basic: 已注册原型监听程序
liveconnect: 调用 JS 方法:document
liveconnect: 调用 JS 方法:URL
network: 正在使用代理 DIRECT 连接 http://10.113.24.169:8000/java_applet/applet.policy
network: 正在使用代理 DIRECT 连接 http://10.113.24.169:8000/java_applet/test.keystore
network: 服务器 http://10.113.24.169:8000/java_applet/test.keystore 请求用 "JSESSIONID=55368C78BC00F743FB8C08159F52B362; Path=/" 执行 set-cookie
basic: 正在引用类载入程序:sun.plugin.ClassLoaderInfo@7f58ef, refcount=1
basic: 已添加进度监听程序:sun.plugin.util.GrayBoxPainter@95da38 
basic: 正在载入小应用程序...
basic: 正在初始化小应用程序...
basic: 正在启动小应用程序...
basic: 正在引用类载入程序:sun.plugin.ClassLoaderInfo@7f58ef, refcount=2
basic: 正在释放类载入程序:sun.plugin.ClassLoaderInfo@7f58ef, refcount=1
network: 正在使用代理 DIRECT 连接 http://localhost:8000/java_applet/m5.jar
network: 正在连接 http://localhost:8000/java_applet/m5.jar 与 cookie "JSESSIONID=C39CC21BCB635CF672DEC6D9E1D72ECB"
basic: 正在从高速缓存加载 http://localhost:8000/java_applet/m5.jar
basic: Reading cached JAR file from JRE 1.5 release
basic: http://localhost:8000/java_applet/m5.jar 的证书从 JAR 高速缓存中读取
security: 正在从 C:\PROGRA~1\Java\JRE15~1.0_1\lib\security\cacerts 装入根 CA 证书
security: 已从 C:\PROGRA~1\Java\JRE15~1.0_1\lib\security\cacerts 装入根 CA 证书
security: 正在从 C:\Users\Administrator\AppData\LocalLow\Sun\Java\Deployment\security\trusted.certs 装入部署证书
security: 已从 C:\Users\Administrator\AppData\LocalLow\Sun\Java\Deployment\security\trusted.certs 装入部署证书
security: 正在从部署会话证书库中装入证书
security: 已从部署会话证书库中装入证书
security: 正在从 Internet Explorer ROOT 证书库装入证书
security: 已从 Internet Explorer ROOT 证书库装入证书
security: 正在从 Internet Explorer TrustedPublisher 证书库装入证书
security: 已从 Internet Explorer TrustedPublisher 证书库装入证书
security: 正在检查证书是否在部署永久证书库中
security: 正在检查证书是否在部署会话证书库中
security: 正在检查证书是否在 Internet Explorer TrustedPublisher 证书库中
security: 获取根 CA 证书库的密钥库对象
security: 获取根 CA 证书库的密钥库对象
security: 正在检查证书是否在根 CA 证书库中
security: 检查证书是否可以使用根 CA 证书库中的证书进行验证
security: 已使用根 CA 证书成功验证证书
security: 无可用的时间标记信息
basic: Plugin modality.pushed
basic: 模态已推进
basic: push javax.swing.JDialog[dialog0,454,226,521x326,layout=java.awt.BorderLayout,modal,title=警告 - 安全,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,3,25,515x298,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]
basic: Plugin modality.popped
basic: 模态已弹出
basic: pop javax.swing.JDialog[dialog0,454,226,521x326,hidden,layout=java.awt.BorderLayout,modal,title=警告 - 安全,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,3,25,515x298,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]
security: 用户只对此会话的代码授予权限
security: 正在将证书添加到部署会话证书库中
security: 已将证书添加到部署会话证书库中
security: 正在将证书保存至部署会话证书库
security: 已将证书保存至部署会话证书库
可以看到policy已经加载了,证书也已经通过验证了
现在出现的问题是:
js调用applet报【java.security.AccessControlException: access denied (java.io.FilePermission c:\111 read)

ava.security.AccessControlException: access denied (java.io.FilePermission c:\111 read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkRead(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileReader.<init>(Unknown Source)
at cn.gwssi.app.message.applet.MessageApplet.loadFile(MessageApplet.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.invoke.JSInvoke.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
at sun.plugin.com.MethodDispatcher.invoke(Unknown Source)
at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.com.DispatchImpl.invoke(Unknown Source)

解决方案 »

  1.   

    印象中,在客户端加载applet后会弹出一个对话框,什么是否确认... 里面有applet提供者信息,客户端确认后applet方能访问本地文件系统,
    但如果applet没有签字则没有这个对话框,也不能访问本地文件,
    你是否见到了这个对话框
      

  2.   

    这个问题的解决方案好像比较多。。http://hi.baidu.com/xiaoduo170/blog/item/d20dcd1198840c6dcb80c4ce.html
      

  3.   

    都看了,没有针对上述问题的解决办法我觉得我的那个是签名与policy策略文件的对应问题

    我的策略文件如下:
    keystore "http://10.113.24.169:8000/java_applet/test.keystore", "JKS";grant signedBy "test" {
    permission java.security.AllPermission;
    };
      

  4.   


    看了你的配置 好像没有配置权限吧。。
    去认真看一下如何配置policy的规则:http://www2.ccw.com.cn/2000/0015/0015b14.asp
      

  5.   

    不是配置的是
           permission java.security.AllPermission;
    权限么
      

  6.   

    最新发现,
    不通过js调用
         有证书的情况下,可以访问本地文件
         没有证书的情况下,无法访问本地文件
          配不配策略无所谓。。
    通过JS调用,怎么着都不行。
      

  7.   

    H E L P!!!!!我就想知道怎么验证策略文件与签名可以关联上
      

  8.   

    查了下,确实如果用js调用applet中方法,会使用js的访问权限,也就是没有访问客户端文件系统的权限,可能需要改一改,不要用js来触发你的applet
      

  9.   

    谢谢楼上各位
    我通过各种测试基本算是明白了
    其实主要是两问题
    1.为什么策略无法生效
    2.为什么JS无法调用applet的方法访问本地文件对于第一个问题
    就要说这个页面了如果这个时候你点运行,那么你的applet将获得AllPermission权限以及你的policy文件所配置的权限,这一点通过Policy.getPolicy() .getPermissions(Test.class.getProtectionDomain() )可以打印出运行时策略
    如果你点取消,那么你的程序只会获得你的policy文件所配置的权限
    对于第二个问题
    这是js的访问权限造成的问题
    js在调用applet的时候使用的是默认的安全沙箱不是applet的安全管理器,解决方法有很多例如  SwingUtilities.invokeLater
    这种方法只是绕过了安全沙箱,并没有解决实质问题,如果那位大侠知道如何给JS授权,一定要分享一下呀参考:
    http://blog.sina.com.cn/s/blog_632982a00100n70l.html
    http://blog.csdn.net/overcast/article/details/145517
    http://topic.csdn.net/t/20061109/13/5145079.html
      

  10.   

    Note: 
    JavaScript code is treated like unsigned code. When a signed applet is accessed from JavaScript code in an HTML page, the applet is executed within the security sandbox. This implies that the signed applet essentially behaves likes an unsigned applet.
    --------------------------------------------------------------------------------参考:
    http://docs.oracle.com/javase/tutorial/deployment/applet/security.html
      

  11.   

    With recent improvements to the Java Plug-in software, unsigned applets launched using Java Network Launch Protocol (JNLP) can safely access the client with the user's permission. It is recommended that you launch your applet using JNLP to leverage expanded capabilities and improve user experience.
      

  12.   

    最近找到一个解决方法:
    1.js中调用callMethodGETFILE(),而不是loadFile(),
    2.返回值是null,别改,可以用set(),get()方法在applet中获取文件的二进制信息,因为js不支持二进制数组;
     public void callMethodGETFILE(){
      AccessController.doPrivileged(new PrivilegedAction<Object>() {
                public Object run() {
                    try {
                  loadFile();//替换成你需要赋予读取文件的方法,然后在js中调用callMethodGETFILE(),而不是loadFile()
                  
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } //这是需要赋予特权的函数
                    return null; // nothing to return
                }
            });
     } 这是从网上找的方法,ie7,ie8测试通过,其他浏览器没试过,jre6版本