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 이다.
- Chrome : How to configure Chrome's Java plugin so it uses an existing JDK in the machine - Stack Overflow
- Firefox : firefox 는 "about:plugins" 로 확인 해 볼 수 있다. How Firefox Loads Plugins 에 따르면 firefox 도 registry 를 scan 하도록 되어 있다고 한다.(about:config 에서 수정가능)
ref. 1 을 보면 applet 은 2가지가 있다고 한다.
- Sandbox Applets
- Privileged applets
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 수정하기
- Modifying a Manifest File (The Java™ Tutorials > Deployment > Packaging Programs in JAR Files)
- How to add a manifest into a Jar file
- Jar manifest example - how to add a manifest file to a jar file | alvinalexander.com
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 의 보안관련 변경사항
- Signing applet code does not grant all-permissions (since 7u25) (Java Platform Group, Product Management blog)
- New security requirements for RIAs in 7u51 (January 2014) (Java Platform Group, Product Management blog)
여하튼 그래서 7u51 부터는 "신뢰할 수 있는 기관(trusted authority)"로 부터 받은 인증서로 code 를 sign 을 해야만 하다. 그리고 application 이 가지고 있는 permission 에 관계없이 sign 을 해야만 한다.
Manifest 속성에 아래 두가지를 반드시 넣어야 한다.
- Permissions
- Codebase
Manifest 에서 Permissions 부분이 mandatory 가 될것이라고 이야기 한다. 이 Permissions 는 아래 2가지 값이 가능하다고 한다.
- Permissions: sandbox
- Permissions: all-permissions
Java to Javascript 통신
Java-to-Javascript CommunicationJSObject 를 이용해서 Java 에서 Javascript 로 data 를 전달하는 방법을 이야기 해 준다.
Javascript to Java 통신
- JavaScript to Java Communication (Scripting)
- 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
- What Applets Can and Cannot Do (The Java™ Tutorials > Deployment > Java Applets)
- How Can An Applet Read Files On The Local File System at JavaRanch
- Signed Applet : 네이버 블로그
- Security in Rich Internet Applications (The Java™ Tutorials > Deployment > Doing More With Java Rich Internet Applications)
- [컴][웹] javascript 의 binary data 를 java applet 으로 넘기기
댓글 없음:
댓글 쓰기