java – 签名小程序的问题

weixin_38071213 2019-09-12 01:06:32
我正在开发一个仅在客户端执行加密/解密的应用程序.我正在使用Spring,jdk 1.6和eclipse.我开发了一个包含加密代码的Applet,它看起来像: public void accessToken(){ try{ File tmpConfigFile = File.createTempFile("pkcs11", "conf"); tmpConfigFile.deleteOnExit(); PrintWriter configWriter = new PrintWriter(new FileOutputStream(tmpConfigFile), true); configWriter.println("name=eToken"); configWriter.println("library=" + "C:\\WINDOWS\\system32\\eTPKCS11.dll"); configWriter.println("slotListIndex=0"); configWriter.println("showInfo=true"); this.pkcs11Provider = new SunPKCS11(tmpConfigFile.getAbsolutePath()); Security.addProvider(this.pkcs11Provider); CallbackHandler cbh = new DialogCallbackHandler(); KeyStore.Builder ksBuilder = KeyStore.Builder.newInstance("PKCS11", null, new KeyStore.CallbackHandlerProtection(cbh)); KeyStore ks = ksBuilder.getKeyStore(); ks.load(null, null); }catch(Exception e){ e.printStackTrace(); } } 我已经创建了jar文件并对其进行了签名,当我在eclipse的本地机器上运行它作为“在Java Applet上运行”时它运行良好也很好并且在我打开包含此applet的html页面时提示输入页面密码但是当我点击调用此accessToken()applet方法的复选框,它在java控制台上给出错误,如: java.lang.SecurityException: Unable to create temporary file at java.io.File.checkAndCreate(Unknown Source) at java.io.File.createTempFile(Unknown Source) at java.io.File.createTempFile(Unknown Source) at message.MessageApplet.accessToken(MessageApplet.java:49) 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.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.plugin2.liveconnect.JavaClass$MethodInfo.invoke(Unknown Source) at sun.plugin2.liveconnect.JavaClass$MemberBundle.invoke(Unknown Source) at sun.plugin2.liveconnect.JavaClass.invoke0(Unknown Source) at sun.plugin2.liveconnect.JavaClass.invoke(Unknown Source) at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$DefaultInvocationDelegate.invoke(Unknown Source) at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo.doObjectOp(Unknown Source) at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 我的html页面看起来像: <SCRIPT LANGUAGE="JavaScript"> function selectedCity() { var elem = document.getElementById('cityRb'); if(elem.checked) { document.messageApplet.accessToken(); } } </SCRIPT></HEAD> <BODY > <b>This is the Applet</b> <script src="http://www.java.com/js/deployJava.js"></script> <script> <!-- applet id can be used to get a reference to the applet object --> var attributes = { id:'messageApplet', code:'message.MessageApplet', width:1, height:1} ; var parameters = {jnlp_href: 'message-applet.jnlp'} ; deployJava.runApplet(attributes, parameters, '1.6'); </script> <FORM NAME="CityChoice"> <input type="radio" id="cityRb" name="City" value="Boston" onClick="selectedCity()"> Boston<br> </form> </BODY > 和我的JNLP文件看起来像: <jnlp spec="1.0+" codebase="" href=""> <information> <title>Message Applet</title> <vendor>Fountainhead</vendor> <offline-allowed/> </information> <update check="background"/> <security> <all-permissions/> </security> <resources> <!-- Application Resources --> <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/> <jar href="message.jar" main="true" /> </resources> <applet-desc name="Message Applet" main-class="message.MessageApplet" width="300" height="300"> </applet-desc> <update check="background"/> </jnlp> 所有文件和jar都在同一个目录中,我的applet类在消息文件夹中请帮帮我,我被困在这里……
...全文
7 点赞 收藏 1
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38074625 2019-09-12
发生这种情况是因为您从javascript调用applet的方法.实际上,当您从javascript调用任何已签名的applet方法时,它表现为unsigned,因为它们都有自己的安全沙箱,您必须在该特定沙箱中执行.现在我已经对您的代码进行了如下更改. final File myFile = (File) AccessController.doPrivileged(new PrivilegedAction() { public Object run(){ String fileName = System.getProperty("user.home") + System.getProperty("file.separator") + "pkcs11.conf"; return new File(fileName); }}); 此AccessController允许您在客户端计算机上创建文件.我的英语不好,如果有任何错误,那就很抱歉.
回复
相关推荐
发帖
其他技术讨论专区
创建于2021-05-12

102

社区成员

其他技术讨论专区
申请成为版主
帖子事件
创建了帖子
2019-09-12 01:06
社区公告
暂无公告