Thursday, July 02, 2009

Java Applet 을 Sign하기

이전까지는 JDK v1.1의 라이브러리를 사용하여 프린트 부분을 처리하였는데
그 이유는 JDK v1.2의 JRE 환경을 IE가 지원해주지 않는다는 이유였다.
(IE에서 사용되는 JVM은 v1.1이다~)


JDK v1.2의 라이브러리를 사용하여 Applet Print를 하기 위해서는
Swing관련, 기타 Font 관련 패키지들을 Signing 하여 사용자에게 내려주어
사용할수 있도록 만들어 주어야 하고,
또는 Java WebStart, Java Plug-in 등의 런타임 환경을 지원해주는 프로그램을
사용자의 PC에 설치해야 한다.


여기서 발생하는 문제점으로
1. 깔끔하고 발전적인 UI를 위해 v1.2를 사용할 경우 이를 위해 사용자가
받아아햐는 파일의 용량이 꽤 크다.(Java WebStart: 약 5M, Java Plug-in: 약 9M )
2. 사용자가 관련 파일을 다운 받은 경우에도 Applet이 사용자의 PC에 접근하기위해서는
IE에 내장된 MS Java VM을 사용하지 않고 Java Plug-in을 사용해야 하는데
HTML Converter는 해당 Applet 처리부분의 제어권을 Java Plug-in에 넘겨주도록
Applet 태그를 Object 태그로 바꾸어준다.
3. 사용자 PC의 각종 장치를 사용하기 위해서는 각각의 장치에 대해 Applet의 접급
권한이 설정되어 있어야 하는데, 사용자 홈 디렉토리에 권한을 sign 한 public key와
권한설정 파일인 policy 파일이 있어야 SecurityException을 피할수 있다.


<해결절차>
우선,


참고자료1)
     http://developer.java.sun.com/developer/technicalArticles/Security/applets/index.html
        에서 policy 파일을 설정해야하는 이유 및 방법 참조     
참고자료2)
     http://java.sun.com/security/signExample12/
        에서 http://java.sun.com/security/signExample12/signedPluginEx.html 참조
        (설정된 권한에 의해 사용자 PC에 접근해 권한 설정 방법을 참조)
참고자료3)
     http://myhome.netsgo.com/specular/security/pluginSigned.html
        에서 SUN Signing 방법 참조.
       
1. 참고자료 1,3에 의해 keytool로 private/public key를 생성하고,
   policytool을 이용하여 .java.policy 파일을 만든다.


생성절차<.keystore>----------------------------------------------------------
> keytool -genkey -alias myPrnCert   -- self-Certification의 alias Name
> Enter keystore password : horsepia   -- keystore file을 사용하기위한 password
> What is your first and last name?
> [Enter]:Sung-Man Bak                 -- 서명자 이름
> What is the name of your organizational unit?
> [Enter]:Laboratory                   -- 부서명
> What is the name of your organization?
> [Enter]:eCIS                         -- 회사명
> What is the name of your city or Locality?
> [Enter]:Busan                        -- 지역명
> What is the name of your state or Province?
> [Enter]:Busan                        -- 도명,주명
> What is the two-letter country code for this unit?
> [Enter]:KR                           -- 국가 code
> Is  correct?
  [no]: y
> Enter key password for  -- MyCert에 대한 password 입력
  (RETURN if same as keystore password):horsepia


내용<.java.policy>----------------------------------------------------------


/* AUTOMATICALLY GENERATED ON Wed Mar 27 14:16:42 GMT+09:00 2002*/
/* DO NOT EDIT */


keystore "file:${user.home}/.keystore", "jks";
/* keystore "C:/Documents and Settings/Administrator/.keystore", "jks"; */


grant signedBy "myPrnCert"{
  permission java.awt.AWTPermission "showWindowWithoutWarningBanner", signedBy "myPrnCert";
  permission java.io.FilePermission ".keystore", "read, write, delete, execute";
  permission java.io.FilePermission ".java.policy", "read, write, delete, execute";
  permission java.lang.RuntimePermission "queuePrintJob";
};      
        
----------------------------------------------------------------------------


2. 참고자료 2에 의해 .keystore와 .java.policy를 사용자의 홈디렉토리에 내려줄
   Applet를 생성한다.
  
   import java.io.*;
   import java.lang.*;
   import java.net.URL;
   import java.applet.Applet;
  
   public class MyLauncher extends Applet
   {
    String OS    = "";
    String UserHome  = "";
  
    File          ksHome;
       URL           keystore;
       URL           jpolicy;
      
       InputStream in;
       DataInputStream dIn;
       DataOutputStream dos;
      
      /*************************************************************
      * copy .java.policy, .keystore file
      *************************************************************/
  
       public void init()
       {
       }
  
       public void start()
       {
           OS       = System.getProperty("os.name");
           UserHome = System.getProperty("user.home");
           StartCopy();
       }
  
       public void StartCopy()
       {
           try
           {
               ksHome = new File(UserHome);
  
               if(!ksHome.exists())
                ksHome.mkdir();
      
               /* keystore file */
               File              copyFile1 = new File(UserHome + "/.keystore");
               FileOutputStream  saveFile1 = new FileOutputStream(copyFile1);
               keystore                    = new URL("http://203.242.179.133/sign/.keystore");
             
               in  = keystore.openStream();
               dIn = new DataInputStream(new BufferedInputStream(in, 4096));
  
               byte buf1[] = new byte[2048];
               int numread1;
               while((numread1 = dIn.read(buf1)) != -1)
                   saveFile1.write(buf1, 0, numread1);
               saveFile1.close();
  
               /* .java.policy file */
               File             copyFile2 = new File(UserHome + "/.java.policy");
               FileOutputStream saveFile2 = new FileOutputStream(copyFile2);
               jpolicy                    = new URL("http://203.242.179.133/sign/.java.policy");
  
               in  = jpolicy.openStream();
               dIn = new DataInputStream(new BufferedInputStream(in, 4096));
  
               byte buf2[] = new byte[2048];
               int numread2;
               while((numread2 = dIn.read(buf2)) != -1)
                   saveFile2.write(buf2, 0, numread2);
               saveFile2.close();
           }
           catch(IOException e)
           {
               System.out.println("error : " + e);
           }
       }
   }   


3. 참고자료 3에 의해 위의 Applet을 컴파일하여 jar로 묶고 signing한다.
> javac MyLauncher.java
> jar cvf MyLauncher.jar MyLauncher.class
> jarsigner -signedjar PrintLauncher.jar MyLauncher.jar myPrnCert


4. .keystore와 .java.policy 파일을 내려주는 Applet은 완성되었고,


5. Applet 소스를 준비한다. (v1.2, Swing 사용)
   첨부파일 참조   프린트 소스라고 치자~


6. 프린트 Applet 소스를 컴파일하여 jar로 묶고 signing 한다.
> javac Preview.java Print.java
> jar cvf Print.jar *.class
> jarsigner -signedjar myPrint.jar Print.jar myPrnCert


7. 프린트를 위한 Applet이 완성되었다.


8. GUI Tool로 html파일을 컨버젼한다.
> java HTMLConverter
-----------------------------------------------------------


Launcher start


-----------------------------------------------------------------


JDK1.2 Security Model Signed Applet Example



9. 브라우저에서 확인한다.

No comments: