이전까지는 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:
Post a Comment