[컴][웹] applet 으로 local file access 하기

applet 과 보안 / 애플릿에 사인하기 / 애플릿과 보안 / 애플릿의 보안설정 /




Test 하기 전에 주의할 점

os 가 64bit 이라 JRE 를 64-bit version 으로 설치를 했었는데, 32-bit browswer(크롬은 64-bit version 이 없다. firefox 도 64-bit 을 정식으로 release 하지 않았다.)에서 동작을 제대로 하지 않는다. 팝업등이 보이지 않는 등의 이상한 현상들이 보였다. 그러니 반드시 32-bit JVM 을 설치하고 나서 applet을 test 해야 한다.

registry 를 확인 해 보면 명확하다. 아래는 chrome 의 java plugin 경로와 관련된 post 이다.




ref. 1 을 보면 applet 은 2가지가 있다고 한다.
  • Sandbox Applets
  • Privileged applets
ref.1 에서 sanbox applets 은 우리가 알다시피 제한된 작업만을 할 수 있다. 그런데 JNLP API를 통해서 local file system 에 file open/save 등의 작업을 할 수 있다고 한다. JNLP API 를 확인해 보면 생각보다 많은 작업이 가능한듯 하다.


Privileged applet 과 관련된 보안사항

ref. 4 에서 privileged applet 에 필요한 요소들을 알려준다.

JNLP 에 아래부분을 추가한다.
<security>
   <all-permissions/>
</security>

기본적으로 Javascript 에서 signed jar 에 있는 security-sensitive code 를 실행할 수 없다. 이것을 가능하게 하기 위해서 AccessController.doPrivileged 를 사용해서 javascript 의 권한을 상승시켜서 code 를 실행할 수 있게 해준다.

그렇지 않으면 기본적으로 javascript 가 실행하는 code 는 sandbox applet 처럼 동작한다.[ref. 1]

아래 경로에서 javascript 에서 applet 의 함수를 호출하는 code 를 볼 수 있다.

이 파일에 대한 demo 는 아래에서 볼 수 있다.

기본적으로 applet 도 browser 내의 공간에서 실행된다. 그래서 local file system 에 접근할 수 없다.



applet 사인하기 Signing an applet

그러나 applet 을 sign 을 하면 가능하다. 그러면 user 에게 이 signer 를 신뢰하겠느냐고 물어보고, user 가 승낙하면 applet 은 full privileges 를 얻게 된다.


Policy files

policy file 을 이용해서 특정 local resource에 대한 특정 권한만 applet 에게 줄 수 있다.
그런데 단점은 이 policy file 이 local file system 에 있어야 한다는 점과 작성하는게 좀 난해하다는 점이다.



Applet 을 sign 하는 방법

자세한 방법은 ref. 3 을 참고하자.

Java 보안 등급

참고로 여기서 이야기하는 것처럼 local 에서 certificate 을 만들어서 signing 을 할 경우 "신뢰할 수 있는 인증기관의 인증서" 로 취급받지 못한다. 그래서 java 의 control panel 에 가서 보안을 중간("medium") 으로 수정해 줘야 한다. 그렇지 않으면 아래와 같은 popup 창이 뜬다.




보안설정을 "중간" 으로 설정하면 아래와 같은 창을 볼 수 있다.




.keystore 생성

먼저 .keystore 를 만들자. keytool 을 이용해서 아래처럼 command 를 날리면 된다.

c:\Program Files\Java\jdk1.7.0_45\bin>keytool -genkey -dname "cn=Name, ou=Seoul, o=Seoul, c=KR" -alias mykeyAlias -keypass mykey -storepass mykey -validity 365

그러면 아래의 path 에 .keystore 가 생성된다.

c:\Users\<user_name>\.keystore

여기에서 keytools 로 만든 .keystore 의 예를 확인할 수 있다.


.jar 에 signing 하기

이제 jarsigner 를 이용해서 .jar file 을 signing 하면 이 .keystore 를 이용해서 .jar 을 signing 하게 된다.

아래처럼 command 를 날리면 된다.

c:\>"c:\Program Files\Java\jdk1.7.0_45\bin\jarsigner.exe" -storepass mykey -keypass mykey "c:\temp\applet_invok\applet_InvokingAppletMethodsFromJavaScript\build\classes_\TiddlySaver.jar" mykeyAlias

이제 TiddlySaver.jar 이 signing 됐다.




Manifest file 수정하기



jar.exe cvfm myApplet.jar myManifest.txt mypackage


위와 같은 모습의 명령어로 manifest 를 추가할 수 있다. f option 은 .jar file을 지정해 주는 것이고, m option 이 manifest file 을 지정해 주는 것이다. option 의 순서와 parameter 의 순서가 같아야 한다.
예를 들어, 위와 같이 fm 인 경우에, .jar 이 나오고 manifest 이름이 나오면 된다.

manifest.txt 는 아래와 같다. 주의할 점은 추가하려는 line 의 끝에 carriage return 이 있어야 인식을 한다는 점이다.

// manifest.txt
Application-Library-Allowable-Codebase: *
Permissions: all-permissions
Codebase: *



  • Application-Library-Allowable-Codebase 에 관한 설명은 여기를 참고하자.
  • Codebase : codebase 는 jar file 이 어디에 있어야 하는지를 이야기 한다. Codebase 에 적혀있는 domain 에서 download 된 jar file 은 괜찮다는 이야기이다.



위와 같은 manifest 를 이용하면 아래처럼 결과가 나온다.

// MANIFEST.MF in .jar file
Manifest-Version: 1.0
Application-Library-Allowable-Codebase: *
Permissions: all-permissions
Codebase: *
Created-By: 1.7.0_45 (Oracle Corporation)




Java 7 update 51 의 보안관련 변경사항


    ref.2 에 따르면 Java 7 update 51 (January, 2014) 에서 부터 2개의 security 의 변화가 있다고 한다. 향상된 인증(enhance authenticate)과 향상된 허가(enhance authorization) 라고 한다.

    여하튼 그래서 7u51 부터는 "신뢰할 수 있는 기관(trusted authority)"로 부터 받은 인증서로 code 를 sign 을 해야만 하다. 그리고 application 이 가지고 있는 permission 에 관계없이 sign 을 해야만 한다.

    Manifest 속성에 아래 두가지를 반드시 넣어야 한다.
    • Permissions
    • Codebase

    Manifest 에서 Permissions 부분이 mandatory 가 될것이라고 이야기 한다. 이 Permissions 는 아래 2가지 값이 가능하다고 한다.
    1. Permissions: sandbox
    2. Permissions: all-permissions



    Java to Javascript 통신

    Java-to-Javascript Communication

    JSObject 를 이용해서 Java 에서 Javascript 로 data 를 전달하는 방법을 이야기 해 준다.


    Javascript to Java 통신

    1. JavaScript to Java Communication (Scripting)
    2. image - Javascript: Blob object to base64 - Stack Overflow

    위의 2번째 글에서 blob 으로 되어 있는 image 를 Java 쪽으로 넘겨서 byte[] 로 변환하는 법을 알려준다. 한가지 주의할 점은, 앞부분에 "MIME type;encoding" 이 있어서 이부분을 제거해 주고 넘겨야 한다.[ref. 5]
    var r = reader.result;
    
    var data = r.substr(r.indexOf(',') + 1)
    
    TiddlySaver.saveFile("c:\\temp\\_testpic.jpg", data);
    
    



    Signing

    이부분은 아직 실제로 해보지 못했다. 그저 어디서 읽은 글을 번역했는데, 출처를 잃어버려서 일단 그냥 적어놓는다.

    Thawte 에서 Sun Java Code Signing certificate 을 구매한다.
    keytool 을 이용해서 certificate 요청을 만든다.
    우리가 만든 certificate 의 public key 부분을 Thawte 에게 보내면
    Thawte이 우리가 보낸 public key 를 authentic 으로 digitally sign 해주고 다시 보내준다.
    Thawte 에게 private key 를 알려주지 않아도 된다.

    applet 을 만들고, jar 로 묶자.
    그리고 이 .jar 을 jarsigner 를 이용해서 sign 하자.
    c:\>jarsigner.exe theapp.jar phony
    
    
    
    
    
    



    References

    1. What Applets Can and Cannot Do (The Java™ Tutorials > Deployment > Java Applets)
    2. How Can An Applet Read Files On The Local File System at JavaRanch
    3. Signed Applet : 네이버 블로그
    4. Security in Rich Internet Applications (The Java™ Tutorials > Deployment > Doing More With Java Rich Internet Applications)
    5. [컴][웹] javascript 의 binary data 를 java applet 으로 넘기기

    댓글 없음:

    댓글 쓰기