3

Я разрабатываю приложение, которое будет выполнять шифрование/дешифрование только на стороне клиента. Я использую Spring, jdk 1.6+ и eclipse. Я разработал апплет, которые содержат криптографический код это выглядит следующим образом:Проблемы с подписанным апплетом

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(); 
     } 
    } 

Я создал файл банки и подписал его, он хорошо работает, когда я запускаю его как «работает на Java-апплете» на локальном компьютере от затмения также его работает хорошо и запрашивает пароль при загрузке страницы при открытии HTML-страницу, которая включает в себя этот апплет, но когда я нажимаю на флажок, который вызывает этот маркер доступа) метод апплета (это дает ошибку на 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> 

все файлы и банки находятся в том же каталоге, и мой класс апплета находится в папке сообщений , пожалуйста, помогите мне, я застрял здесь ...

+0

* «Когда я нажимаю на галочку, которая звонит ..» * В поле «checkbox» DYM «cityRb» радио? 1) W3C [определение флажка] (http://www.w3.org/wiki/HTML/Elements/input/checkbox) больше соответствует строкам ' New York' 2) Если это так, вызов JS вызывает непосредственную проблему. –

+1

http://stackoverflow.com/questions/1006674/how-can-i-get-a-signed-java-applet-to-perform-privileged-operations-when-called –

ответ

3

Это произошло потому, что вы вызываете свой метод апплета из своего javascript. Фактически, когда вы вызываете какой-либо подписанный метод апплета из javascript, он ведет себя как 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 позволяет вам создать файл на клиентской машине. Я плохо разбираюсь в английском, поэтому, если есть ошибки, то извините.

+1

благодарит Balasaheb за его работу. Наше имя такое же ... – Pravin

0

Вам нужно файл политики тоже, чтобы разрешить подписанный апплет создавать временный файл.
Пожалуйста, добавьте номер строки в код, чтобы люди могли связывать трассировку стека.

я думаю, что вы код File.createTempFile("pkcs11", "conf"); бросает SecurityException. Посмотрите это message.MessageApplet.accessToken(MessageApplet.java:49) взято из вашей трассы стека.

+0

спасибо за повтор, да, вы правы, что строка throw SecurityException. теперь у меня есть файл jnlp, в котором я упомянул но все же я столкнулся с ошибкой. должен ли я поместить его в мой подписанный файл jar, если да, как передать его в файл JNLP? – Pravin

2

Если вы вызываете из (без знака) javascript функцию INSIDE с подписанным апплетом, вы будете МГНОВЕННО ПЕРЕРЫВАТЬ подпись. Это означает, что апплет НЕМЕДЛЕННО теряет все привилегии и не будет в состоянии написать что-нибудь на диске ...

Посмотри на это, в нижней части страницы: http://docs.oracle.com/javase/tutorial/deployment/applet/security.html

Примечания: код JavaScript обрабатывается как неподписанный код. Когда подписанный апплет доступен из кода JavaScript на странице HTML, апплет равен , выполненному в изолированной программной среде. Это означает, что подписанный апплет по существу ведет себя любит неподписанный апплет. **

Таким образом, вы, вероятно, придется начать свою функцию сразу после инициализации(), а затем, Копание LiveConnect, перезвоните функции JS на странице Из апплета, уведомляющего «операция завершена» ...

0

Вы всегда можете предоставить данные апплету через Javascript для хранения их в объекте FIFO (первый в первом) и использовать таймер на апплете, чтобы проверить FIFO и обработать запросы. Но я думаю, что возвращение значений неудачных/успешных кодов не будет легким ...

Смежные вопросы