锁定老帖子 主题:JAVA数字签名提升权限
精华帖 (0) :: 良好帖 (5) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-19
本文描述怎样通过数字签名提升java的访问权限,本文环境: os:Ubuntu9.10 64b Firefox:3.5.8 jre环境:JRE 1.6.0_18(64b) 测试java代码和jsp页面代码如下: public class TestApplet extends Applet { private static final long serialVersionUID = 1L; private void info(String msg) { System.out.println(msg); } @Override public void init() { super.init(); readFile("Linux".equalsIgnoreCase(System.getProperty("os.name")) ? "/etc/hostname" : "c:\\boot.ini"); } private void readFile(final String filePath) { info("读取文件:" + filePath); String text = AccessController.doPrivileged(new PrivilegedAction<String>() { @Override public String run() { StringBuilder buffer = new StringBuilder(); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(filePath)); while(reader.ready()) buffer.append(reader.readLine()); } catch (Exception e) { throw new IllegalStateException(e); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return buffer.toString(); } }); info("读取结果为:" + text); } } <%@ page language="java" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <body> <applet id="hh" alt="Applet" width="100" height="100" code="org.skzr.TestApplet" archive="skzr-applet-sign.jar" codebase="<%=basePath %>demo" mayscript> </applet> </body> </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在控制台可以发现正确读取了文件:下面是控制台输出: 读取文件:/etc/hostname 读取结果为:skzr basic: Applet initialized 至此权限提升完毕 ^ ^ 效果图:google chrome for linux 至于Windows下是一样的效果
例子demodemo.zip其中skzr-applet.jar未签名 skzr-applet-sign.jar是签名后的包 总结:1 jre的策略文件不需要更改的
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-20
唉 怎么没有任何反应哦!
|
|
返回顶楼 | |
发表时间:2010-03-20
skzr.org 写道 唉 怎么没有任何反应哦!
呵呵,我关注一下。 目前来说,还没有用到这个。不过我会收藏一下,应该以后是个很好的解决方案呢 |
|
返回顶楼 | |
发表时间:2010-03-20
我只是在答题,写下mark下
呵呵,确实我一直想去一个以java为平台发展的公司做! 自己发展吧 Good Luck! nihaoyoushang |
|
返回顶楼 | |
发表时间:2010-03-21
关于这方面的资料,推荐看看比较权威和全面的《Java加密与解密的艺术》,在JE上就能搜索到,近期将犀利上市。
|
|
返回顶楼 | |
发表时间:2010-03-22
谢谢linux1689!
linux1689 写道 关于这方面的资料,推荐看看比较权威和全面的《Java加密与解密的艺术》,在JE上就能搜索到,近期将犀利上市。
呵呵这么专业的加密艺术学不过来阿! 现在已经过了技术追求期,目前致力于把自己所学知识积累起来! 此文是问答中某人的问题,关于签名applet后还要修改jre的策略文件的问题! 关于Applet的数字签名提问人:aspnetdb 曾经也迷茫过,明明签名了,为什么还要修改策略,2年前吧,和此问题一样的 当年详情: 写一个引擎(applet运行在浏览器中作为服务为JS 提供直接访问远端web服务器中的java对象的能力)提供服务:缓存,业务处理,构想是不是有离线数据提交功能,想法太多,很多东西需要使用反射和访问站点资源,所以迫切需要某些特权操作(呵呵,在applet中使用spring作为容器)——听说数字签名可以 参考了网上N多关于java签名提升访问系统资源权限的问题,好像都是相互抄袭,虽然签名了,可是代码依然提示没有权限访问!!!郁闷了不少时间,一次偶然让我发现了AccessController.doPrivileged(...)的秘密,纯属偶然 开始实现的远端调用java利用的是自己定义协议访问特定url,然后服务器解析协议调用对象返回结果(特别类似dwr的实现),一直在权限这里卡了,我协议传输直接使用Serializable传输的!后来看了spring提供了http invoker就切换到spring的了,结果发现spring执行远端的时候没有出现权限问题,跟踪代码后找到了AccessController.doPrivileged(...) 至此问题解决! 什么需要修改jre的策略文件提升权限,我看比较片面,也不是很好——客户端那么多jre改起来麻烦阿,貌似任何java程序的策略都会因此而改变,不太好阿! |
|
返回顶楼 | |
发表时间:2010-03-22
呵呵,这几天懒了,才看到。这会我仔细的看看。一会有收获再顶你哈。
|
|
返回顶楼 | |
发表时间:2010-03-22
8错
听说过这种数字签名提升权限,但没机会试过 收起来备用拉,以后可以参考 |
|
返回顶楼 | |
发表时间:2010-03-22
客户端应该还要装JRE,这是个硬伤...
|
|
返回顶楼 | |
发表时间:2010-03-22
最后修改:2010-03-22
iehyou 写道 客户端应该还要装JRE,这是个硬伤...
管理系统安装JRE不算硬伤~~~其他的就有点小麻烦了。。 |
|
返回顶楼 | |