java Applet 数字签证提升权限

本文描述怎样通过数字签名提升java的访问权限,本文环境:

os:Ubuntu9.10 64b

Firefox:3.5.8 jre环境:JRE 1.6.0_18(64b)

测试java代码和jsp页面代码如下:

Java代码   收藏代码
  1. public class TestApplet extends Applet {  
  2.     private static final long serialVersionUID = 1L;  
  3.     private void info(String msg) {  
  4.         System.out.println(msg);  
  5.     }  
  6.     @Override  
  7.     public void init() {  
  8.         super.init();  
  9.         readFile("Linux".equalsIgnoreCase(System.getProperty("os.name")) ? "/etc/hostname" : "c:\\boot.ini");  
  10.     }  
  11.     private void readFile(final String filePath) {  
  12.         info("读取文件:" + filePath);  
  13.         String text = AccessController.doPrivileged(new PrivilegedAction<String>() {  
  14.             @Override  
  15.             public String run() {  
  16.                 StringBuilder buffer = new StringBuilder();  
  17.                 BufferedReader reader = null;  
  18.                 try {  
  19.                     reader = new BufferedReader(new FileReader(filePath));  
  20.                     while(reader.ready()) buffer.append(reader.readLine());  
  21.                 } catch (Exception e) {  
  22.                     throw new IllegalStateException(e);  
  23.                 } finally {  
  24.                     if (reader != null) {  
  25.                         try {  
  26.                             reader.close();  
  27.                         } catch (IOException e) {  
  28.                             e.printStackTrace();  
  29.                         }  
  30.                     }  
  31.                 }  
  32.                 return buffer.toString();  
  33.             }  
  34.         });  
  35.         info("读取结果为:" + text);  
  36.     }  
  37. }  
Html代码   收藏代码
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6. <html>  
  7.     <body>  
  8.     <applet id="hh" alt="Applet" width="100" height="100"   
  9.         code="org.skzr.TestApplet"   
  10.         archive="skzr-applet-sign.jar"  
  11.         codebase="<%=basePath %>demo" mayscript>  
  12.     </applet>  
  13.     </body>  
  14. </html>  
 

因为考虑到大家一般是windows 32位环境所以:导出时使用我的linux64下仅有的32位jdk:jdk1.6.0_14-32

把以上类导出为包:skzr-applet.jar

签名:(使用同一个32位jdk:jdk1.6.0_14-32)

1 创建keystore:

  /prog/java/jdk1.6.0_14-32/bin/keytool -genkey -keystore skzr-applet.keystore -alias skzr-applet

2 签名:

 /prog/java/jdk1.6.0_14-32/bin/jarsigner -keystore skzr-applet.keystore skzr-applet.jar skzr-applet

把demo放入tomcat的webapps下,打开http://localhost:8080/demo/index.jsp测试

 

index.jsp里面使用未签名包:skzr-applet.jar在控制台可以发现异常:

java.lang.IllegalStateException: java.security.AccessControlException: access denied (java.io.FilePermission /etc/hostname read),因为我的是linux所以读取此文件

index.jsp里面使用已签名包:skzr-applet-sign.jar在控制台可以发现正确读取了文件:下面是控制台输出:

Html代码   收藏代码
  1. 读取文件:/etc/hostname  
  2. 读取结果为:skzr  
  3. basic: Applet initialized  

 至此权限提升完毕 ^ ^

效果图:

google chrome for linux

 firefox 3.5.8

至于Windows下是一样的效果


 

 例子demo

demo.zip
其中skzr-applet.jar未签名 skzr-applet-sign.jar是签名后的包

总结:

1 jre的策略文件不需要更改的
如果真的签名了,客户端加载运行jar时会出现询问是否信任此签名的提示的!

问题在于,你如果签名了整个applet jar那么每一次重新发布都需要重新签名,比较繁琐,好的办法是,把需要提升权限的打为一个jar,一般这个jar不会经常更改的,签名此jar就可以了,其他的(如界面UI)的jar就算修改了也不需要重新签名的

2 要点:需要提升权限的类一定要放入一个jar包,签名一次即可

3 注意执行需要权限的代码需要一个特殊的方法执行,
AccessController.doPrivileged(...)如果信任此签名,将可以执行此代码




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值