Applet 디지털 서명 기술 완전 공략

 

     여기 서 말 하 는 것 은 모두 에 게 떳떳 하지 못 하 다.어쨌든 2 년 전, 나 는 이 글 을 쓰 고 싶 었 지만, 그 때문에 계속 쓰 지 못 하 는 것 이 귀 찮 았 다.동시에 자신의 물건 에 도 좋다.얼마 전에 우리 첫째 는 나 에 게 또 이 물건 을 만 들 라 고 했 는데 내 가 예전 에 가지 고 있 던 자 료 를 남기 지 않 았 고 또 자신의 인상 으로 새로 왔 다 는 것 을 알 게 되 었 다.그러나 인터넷 에 쓴 것 이 정말 천박 하 다 는 것 을 발견 하고 사실은 그냥 갔다.어쨌든 우 리 는 프로그램 원숭이 이기 때문에 학생 이 아니 라 아무리 많은 것 을 생각 하 더 라 도 자신 이 정리 한 것 을 적어 서 처음에 공부 한 사람 에 게 깨 우 침 을 주 었 다.내용 을 배 우 는 것 을 통 해 서버 를 통 해 로 컬 클 라 이언 트 를 완전히 방문 하 는 능력 을 갖 출 수 있 습 니 다.어떠한 권한 에 도 시 달리 지 않 습 니 다.    
     간단하게 Applet 숫자 서명 이 어떻게 된 일 인지 말씀 드 리 겠 습 니 다. 바로 applt 이 jdk 의 도 구 를 이용 하 는 것 입 니 다.   $JAVA_HOME / bin 아래 의 exe 파일 을 서버 에서 로 컬 client 에 접근 하 는 보안 서명 을 합 니 다.
만약 에 고객 이 당신 의 애플 트 서명 을 정말 믿 게 하려 면 몇 백 위안 을 들 여 CA 산하 versign 회사 에 가서 신뢰 할 수 있 는 서명 증 서 를 구 매 할 수 있 습 니 다.
     본 고 는 주로 Tomcat 를 중간 부품 으로 하여 상세 한 서명 절 차 를 설명 한다.중 $JAVAHOME jdk 설치 폴 더, $TOMCATHOME Tomcat 설치 폴 더
      Applet 의 서명 과정 을 실현 합 니 다. 예 를 들 어 다음 과 같 습 니 다.
      1. 환경 변수 설정   $JAVA_HOME (windows 시스템 에 편리 한 모든 폴 더 를 직접 사용 할 수 있 습 니 다.     $JAVA HOME / bin 의 exe 명령 입 니 다. 그 중 exe 는 keytool. exe, jarsigner. exe, HtmlConverter. exe 를 포함 합 니 다.
     2. $TOMCATHOME 에서 webapps 폴 더 의 ROOT 폴 더 를 복사 하여 실 용적 이지 않 은 쓰레기 를 삭제 하고 자신의 웹 애플 리 케 이 션 이름 으로 변경 합 니 다.웹 애플 트  서명 할 jar 를 $TOMCAT 로 복사 합 니 다.HOME/webapps/webapplet  아래, 여기 서 주의해 야 할 것 은 jar 가방 에 서명 하려 면 전체 procject 참조 와 관련 된 jar 가방 에 서명 해 야 합 니 다.안 그러면 하나 덜 사인 해도 못 해.
    3. 테스트 html 페이지 applet. html 만 들 기
      <APPLETCODEBASE = "."CODE = "com.aspire.reportPlatform.webagent.WebAgentApplet.class"ARCHIVE ="applet.jar"NAME = "TestApplet"WIDTH = 400HEIGHT = 300HSPACE = 0VSPACE = 0ALIGN = middle></APPLET>
    4.  cmd 명령 프롬프트 를 열 면 $TOMCATHOME/webapps/webapplet  다음 실행 HtmlConverter
      예 를 들 면:  F:/appletTomcat/webapps/webapplet>HtmlConverter 
    창 을 팝 업 합 니 다.창 에 변환 할 html 파일 을 입력 하 십시오. 예 를 들 어 제 가 방금 쓴 applet. html, 변 환 된 것 은 jsp 를 쓰 는 것 도 똑 같이 적 용 됩 니 다.
    다음 과 같은 변환 완료:
         classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"    codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,1"    WIDTH = 400 HEIGHT = 300 NAME = "TestApplet" ALIGN = middle VSPACE = 0 HSPACE = 0 >                       
                 type = "application/x-java-applet;version=1.5" /            CODE = "com.aspire.reportPlatform.webagent.WebAgentApplet.class" /            JAVA_CODEBASE = "." /            ARCHIVE = "applet.jar" /            NAME = "TestApplet" /            WIDTH = 400 /            HEIGHT = 300 /            ALIGN = middle /            VSPACE = 0 /            HSPACE = 0     scriptable = false     pluginspage = "http://java.sun.com/products/plugin/index.html#download">    
           
                
       여기 에는 반드시 주의해 야 할 것 이 하나 있다.위 에 써 있어 요.    6. 편리 하 게 bat 파일 을 쓰 고 놀 기 위해 서명 을 합 니 다. 예 를 들 어 제 가 쓴 applt. bat.
       내용 은 다음 과 같다.       
keytool -genkey -keystore pepper.store -alias pepper   
keytool -export -keystore pepper.store -alias pepper -file pepper.cert   
jarsigner -keystore pepper.store applet.jar pepper
jarsigner -keystore pepper.store commons-codec-1.3.jar pepper
jarsigner -keystore pepper.store commons-httpclient-3.1.jar pepper
jarsigner -keystore pepper.store commons-logging.jar pepper
jarsigner -keystore pepper.store dom4j.jar pepper
jarsigner -keystore pepper.store FlowMetaData.jar pepper
jarsigner -keystore pepper.store ibatis-2.3.2.715.jar pepper
jarsigner -keystore pepper.store jgraph.jar pepper
jarsigner -keystore pepper.store log4j-1.2.9.jar pepper
jarsigner -keystore pepper.store MetaDataManage.jar pepper
jarsigner -keystore pepper.store ojdbc14.jar pepper
jarsigner -keystore pepper.store RDPCommon.jar pepper
jarsigner -keystore pepper.store swing-layout-1.0.jar pepper
jarsigner -keystore pepper.store ws-commons-util-1.0.1.jar pepper
jarsigner -keystore pepper.store xmlrpc-client-3.1.jar pepper
jarsigner -keystore pepper.store xmlrpc-common-3.1.jar pepper

 
안의 뜻 을 설명 하 다. 
     keytool -genkey -keystore pepper.store -alias pepper      #pepper. store 키 라 이브 러 리 파일 을 만 듭 니 다. 이 키 라 이브 러 리 의 별명 은?  pepper 
    위 에 있 는 말 을 입력 하면password jdk 를 입력 하 는 것 을 알려 줍 니 다.  changeit, 이 password 는 변경 할 수 있 습 니 다. 어떻게 변경 하 는 지 인터넷 에서 찾 아 보 세 요. 저 는 열 을 기억 하지 못 하지만 변경 하지 않 는 것 을 권장 합 니 다. 왜냐하면 가끔 password jdk 1.4 를 바 꾸 었 기 때문에 이상 하 게 사용 하기 어 려 울 때 가 있 습 니 다.
      password 가 지면 해당 하 는 서명 정 보 를 입력 하 십시오.
   F: / applicationTomcat / webapps / applet > keytool - genkey - keystore pepper. store - alias pepper 입력 keystorepassword:  changeit 이름과 성 은 무엇 입 니까?  [Unknown]:  LEe 당신 의 조직 단위 이름 은 무엇 입 니까?  [Unknown]:  aspire 조직 이름 이 무엇 입 니까?  [Unknown]:  aspire 가 있 는 도시 나 지역 이름 은 무엇 입 니까?  [Unknown]:  sz 당신 이 있 는 주 나 성 이름 은 무엇 입 니까?  [Unknown]:  gd 이 단위 의 이니셜 국가 코드 는 무엇 입 니까?  [Unknown]:  cnCN = LEe, OU = aspire, O = aspire, L = sz, ST = gd, C = cn 정확 합 니까?  [아니오]:  y
입력 한 주 password        (keystore password 와 같다 고 가정 하고 Enter 를 누 르 십시오):
password 라 이브 러 리 에서 인증 서 를 내 보 내 는 password 를 입력 하 십시오.
keytool -export -keystore pepper.store -alias pepper -file pepper.cert   생 성 된 키 라 이브 러 리 에 따라 pepper. cert 내 보 내기  인증서, password changeit 를 입력 하 십시오.
jarsigner - keystore pepper. store applet. jar pepper 는  applet.jar  서명, 인증서 암호 입력  저 는 changeit 를 쓸 수 있 습 니 다. 아래 의 jar 가방 은 반복 적 으로 입력 되 어 있 습 니 다. 더 이상 말 하지 않 겠 습 니 다.over !   여러분 들 이 자신의 서명 을 할 수 있 을 것 이 라 고 썼 습 니 다. 저 는 파일 을 읽 은 경험 이 있 습 니 다. 그것 은 바로 애플 리 케 이 션 에서 잘 쓴 것 이 애플 릿 에 도착 하면 사용 하기 어렵 다 는 것 입 니 다.애플 트 의 불 러 오 는 메커니즘 은 서버 에 서명 한 jar 패 키 지 를 클 라 이언 트 의 일시 폴 더 에 다운로드 하 는 것 입 니 다. 문 이름 이 모두 바 뀌 었 습 니 다.
  이 임시 폴 더 는 나의 것 과 같다.  C:/Documents and Settings/x_lixin_a/Application Data/Sun/Java/Deployment/cache/javapi/v1.0/jar 
그래서 나 는 파일 을 읽 는 것 을 모두 client 로 컬 에 다운로드 했다.다운로드 
  System.getProperty("java.io.tmpdir")    의 폴 더 아래, 여기 서 읽 으 면 문제 열 이 나 지 않 습 니 다. 로 그 는 가끔 문제 가 발생 할 수 있 습 니 다. * *. log 를 직접 쓰 는 것 을 권장 합 니 다. 그러면 실행 할 때 생 성 된 로그 파일 을 데스크 톱 에 던 집 니 다. 사실은 로그 가 있 는 것 을 권장 하지 않 습 니 다. 사용자 가 이 물건 을 보 는 것 이 불쾌 하기 때 문 입 니 다.
내 가 쓴 애플 트 도 보 여 줘.
사고방식: 1.  읽 어야 할 프로필 을 로 컬 에 다운로드 합 니 다.2 .  main 클래스 를 실행 합 니 다.뛰다  테스트:  ... 에 있다  ie 입력http://localhost:8080/webapplet          애플 트 팝 업 상자 가 있 는 것 을 보고 실행 을 클릭 하면 됩 니 다. 참고 로 오 류 를 보면 오른쪽 아래 작업 표시 줄 에 나타 난 큰 찻주전자 아이콘 을 주의 할 수 있 습 니 다.        애플 트 를 실행 하면 이 물건 을 시작 합 니 다.오른쪽 단 추 를 누 르 면 메 인 콘 솔 을 여 는 옵션 이 있 습 니 다.이 옵션 을 누 르 면 대화 상자 가 팝 업 됩 니 다. 이 대화 상자.        서명 에 문제 가 있 는 지 확인 할 수 있 습 니 다. System. out. println () 으로 이 콘 솔 에 연결 할 수 있 지만 로 컬 에 있 는 것 을 권장 합 니 다.        Eclipse procject 에 서 는 면접 을 통과 하고 있 습 니 다.   후기:  여기까지 쓰 면 애플 트 디지털 서명 을 어떻게 실현 하 는 지 아 실 겁 니 다. 궁금 한 점 이 있 으 면 csdn 에서 저 를 잡 거나 메 일 을 보 낼 수 있 습 니 다.   [email protected],  로그 로그 설정 이 더 좋 은 해결 방법 이 있 으 면 꼭 알려 주세요. 서로 교류 하 세 요.내 가 쓴 이 문장 은 그런대로 괜찮다 고 생각한다.  친 구 는 나 를 도와 대 들 수 있 기 를 바란다. 1 년 후에 나 는 인터넷 에 쓴 그 쓰레기 글 을 보지 않 기 를 바란다. (지금 그 글 은 어디 에 나 쓰 여 있다. 이 문 제 를 해결 할 수 없다.)   ~oo~
코드: 
 
    
package com.aspire.reportPlatform.webagent;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Container;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import javax.swing.JApplet;

import com.aspire.rdp.flowdesinger.LogonDialog;



public class WebAgentApplet extends JApplet {

	public static Applet m_runningApplet = null;

	protected char m_osPrefix;

//	private OctetSeqHolder resp = null;

	private Container contentPane = null;

	public static String agentID;
	
	private static Long agentLongID;

	//	private static final String DLLFOLDERPATH= System.getProperty("user.dir")
	// ;

	//	private static final String
	// DLLFOLDERPATH=System.getProperty("java.home")+File.separator+"lib"+File.separator+"ext";

	private static final String DLLFOLDERPATH = System.getProperty("java.home")
			+ File.separator + "bin";
	
	String TEMP_DIR = System.getProperty("java.io.tmpdir");

	private int result = 1;

	private int count = 0;

	public static String certerIP = null;

	private String nickname = null;

	public static String serverFullAddress;

	/**
     * @throws java.lang.AbstractMethodError
     */
    public void init() {

	    certerIP = getParameter("centerAddress");

		certerIP = new String("192.168.168.111");

		System.err.println("centerIP is" + certerIP);
		System.out.println(" user.dir = "+ System.getProperty("user.dir"));
		nickname = getParameter("nickname");
		serverFullAddress = String.valueOf(getCodeBase());
		m_osPrefix = System.getProperty("os.name").toLowerCase().charAt(0);
//		installLibraries();
		
		DirectoryVO directoryVOArray[] = createDirectories(); 
		
		for(int i=0;i< directoryVOArray.length;i++) {
			installConfigResources(directoryVOArray[i]);
		}
		
		
		drawPane();
		
		LogonDialog logonDialog = new LogonDialog();
		logonDialog.setVisible(true);

		try {
//			        add(panel);
			if (m_runningApplet != null) {
				StatusPanel.getStatusPanelInstance().setStatus((byte) 11);
			} else {
				m_runningApplet = this;
//					webAgent = new WebAgent();
//					initializeCommunication(webAgent);
				StatusPanel.getStatusPanelInstance()
				.setStatus((byte) 11);
//					if (result == 0) {
//						StatusPanel.getStatusPanelInstance()
//								.setStatus((byte) 0);
//					} else {
//						StatusPanel.getStatusPanelInstance()
//								.setStatus((byte) 8);
//					}
					//					 heartbeatInfo = new HeartbeatInfo();
					//		        new Thread(heartbeatInfo).start();
//					webAgent.initialize(webAgent, this);
//					sendHeartInfo();		
			}
		} catch (Exception _ex) {
			//			LogFile.getInstance().print(0, "WebAgentApplet.init()",
			//					" Applet initial Failed !");
			//			_ex.printStackTrace();
			StatusPanel.getStatusPanelInstance().setStatus((byte) 8);
			_ex.printStackTrace();
//			destroy();
		}
	}
    
    private DirectoryVO[] createDirectories() {
    	DirectoryVO[] directoryVOArray = new DirectoryVO[3];
    	DirectoryVO  directoryVO =  new DirectoryVO();
    	
    	String config = TEMP_DIR+"rdp";
		
		File configFile=new File(config);
		if(!configFile.exists()) {
			configFile.mkdir();
		}
		String plugins = config + File.separator + "plugins";
		File pluginsFile= new File(plugins);
		if(!pluginsFile.exists()) {
			pluginsFile.mkdir();
		}
		String email = plugins + File.separator + "email";
		File emailFile= new File(email);
		if(!emailFile.exists()) {
			emailFile.mkdir();
		}
		
		directoryVO.setPathName(email);
		directoryVO.setZipName("emailPlugins.zip");
		directoryVOArray[0] = directoryVO;
		String images = config + File.separator + "images";
		File imagesFile = new File(images);
		if(!imagesFile.exists()) {
			imagesFile.mkdir();
		}
		
		String cfg = config + File.separator + "cfg";
		File cfgFile = new File(cfg);
		if(!cfgFile.exists()) {
			cfgFile.mkdir();
		}
		DirectoryVO  directoryVO1 =  new DirectoryVO();
		directoryVO1.setZipName("images.zip");
		directoryVO1.setPathName(images);
		directoryVOArray[1] = directoryVO1;
		
		DirectoryVO  directoryVO2 =  new DirectoryVO();
		directoryVO2.setZipName("cfg.zip");
		directoryVO2.setPathName(cfg);
		directoryVOArray[2] = directoryVO2;
		
    	return directoryVOArray;
    }
        
    private void installConfigResources(DirectoryVO directoryVO){
    	String archivePath = String.valueOf(getCodeBase()) + "native" + "/" + directoryVO.getZipName();
    	System.out.println("  archivePath = " + archivePath);
		ZipInputStream zis = null;
		ZipEntry entry = null;
		URLConnection con = null;
		
			
		try {
			con = (new URL(archivePath)).openConnection();
			con.setUseCaches(false);
			con.connect();
			zis = new ZipInputStream(con.getInputStream());
			while ((entry = zis.getNextEntry()) != null){
				installConfigResource(zis, entry.getName(),directoryVO.getPathName());
			}
		} catch (IOException ioe) {
			StatusPanel.getStatusPanelInstance().setStatus((byte) 8);
			ioe.printStackTrace();
			//			LogFile.getInstance().print(0,
			// "WebAgentApplet.installLibraries()",
			//					"install have IOException ");
		}catch(Exception e){
		    e.printStackTrace();	
		}finally {
			con = null;
			try {
				zis.close();
			} catch (IOException e) {
				// TODO        catch  
				e.printStackTrace();
			}
		}
    }
    
    
    private void installConfigResource(ZipInputStream archive, String configResourceName,String path){
    	BufferedOutputStream out = null;
		byte buffer[] = new byte[1024];
		int count = 0;
		String configFullPathName = path + File.separator + configResourceName;
		
		try {
			out = new BufferedOutputStream(
					new FileOutputStream(configFullPathName));
			while ((count = archive.read(buffer)) > 0)
				out.write(buffer, 0, count);
			out.close();
		} catch (IOException e) {
			
			e.printStackTrace();
		}catch(Exception e){
		    e.printStackTrace();	
		}finally{
			try {
				out.close();
			} catch (IOException e1) {
				// TODO        catch  
				e1.printStackTrace();
			}
		}

		
    }
    


	public void drawPane() {
		contentPane = getContentPane();
		contentPane.setBackground(Color.white);
		contentPane.add(StatusPanel.getStatusPanelInstance());
	}

	public void destroy() {

		try {
			if (m_runningApplet == this) {
//				webAgent.testManagerModule.close();
//				StatusControl.getStatusControlInstance().notifyToCenter(StatusControlModuleConstant.AGENT_DOWN_SUCCESS,agentLongID);
//				appletCommunicateModule.stop();

			}
		} catch (Exception e) {
			//			LogFile.getInstance().print(0, "WebAgentApplet.destroy()",
			//					"UnknownHostException : cannot destory applet ");
             
			e.printStackTrace();
		} finally {
			System.exit(0);
			System.err.println("in applet close !!!!");
		}

	}
	
	private void installLibraries() {

		String archivePath = String.valueOf(getCodeBase()) + "native";
		System.err.println(getCodeBase());
    	ZipInputStream zis = null;
		ZipEntry entry = null;
		URLConnection con = null;
		String archiveName;
		switch (m_osPrefix) {
		case 119: // 'w'
			archiveName = "winLib.zip";
			break;

		case 108: // 'l'
			archiveName = "linuxLib.zip";
			break;

		case 115: // 's'
			archiveName = "solarisLib.zip";
			break;

		default:
			archiveName = "winLib.zip";
			break;
		}
		try {
			con = (new URL(archivePath + "/" + archiveName)).openConnection();
			con.setUseCaches(false);
			con.connect();
			zis = new ZipInputStream(con.getInputStream());
			while ((entry = zis.getNextEntry()) != null){
				installLibrary(zis, entry.getName());
			}
		} catch (IOException ioe) {
			StatusPanel.getStatusPanelInstance().setStatus((byte) 8);
			ioe.printStackTrace();
			//			LogFile.getInstance().print(0,
			// "WebAgentApplet.installLibraries()",
			//					"install have IOException ");
		}catch(Exception e){
		    e.printStackTrace();	
		}finally {
			con = null;
			try {
				zis.close();
			} catch (IOException e) {
				// TODO        catch  
				e.printStackTrace();
			}
		}
	}

	private void installLibrary(ZipInputStream archive, String dllName) {
		BufferedOutputStream out = null;
		byte buffer[] = new byte[1024];
		int count = 0;
		String dllFullPathName = DLLFOLDERPATH + File.separator + dllName;
		System.out.println("  dllFullPathName = " + dllFullPathName);
		try {
			out = new BufferedOutputStream(
					new FileOutputStream(dllFullPathName));
			while ((count = archive.read(buffer)) > 0)
				out.write(buffer, 0, count);
			out.close();
			//          if(m_osPrefix != 'w')
			//              CommandLineUtility.runCommand("chmod 0775 " + dllFullPathName);
		} catch (IOException e) {
			
			e.printStackTrace();
			//			LogFile.getInstance().print(0, "WebAgentApplet.installLibrary()",
			//					"install single Library failed ");

			//          exitDueToException(e, "copying a native library file into JRE
			// directory");
		}catch(Exception e){
		    e.printStackTrace();	
		}finally{
			try {
				out.close();
			} catch (IOException e1) {
				// TODO        catch  
				e1.printStackTrace();
			}
		}
	}

	//	private void installLogFile(){
	//		try {
	//			String
	// logProperties=System.getProperty("java.home")+File.separator+"bin"+File.separator+"log4j.properties";
	//			File f=new File(logProperties);
	//			f.createNewFile();
	//				FileOutputStream fopt=new FileOutputStream(f);
	//				String firstParagraph=new String("##LOGGERS##/r/n#define a logger named
	// SEAMISLogger/r/nlog4j.rootLogger=INFO,file/r/n/r/n");
	//				fopt.write(firstParagraph.getBytes());
	//				String senondParagraph=new String("##APPENDERS##/r/n#define an appender
	// named file,which is set to be a
	// RollingFileAppender/r/nlog4j.appender.file=org.apache.log4j.RollingFileAppender/r/n"+"log4j.appender.file.File="+System.getProperty("java.home")+File.separator+"bin"+File.separator+"agentlog.txt"+"/r/n/r/n");
	//	        	fopt.write(senondParagraph.getBytes());
	//				String thirdParagraph=new String("##LAYOUTS##/r/n#assign a SimpleLayout
	// to file
	// appender/r/nlog4j.appender.file.layout=org.apache.log4j.SimpleLayout/r/n");
	//				fopt.write(thirdParagraph.getBytes());
	//				fopt.close();
	//			} catch (FileNotFoundException e) {
	//				// TODO        catch  
	//				e.printStackTrace();
	//			} catch (IOException e) {
	//				// TODO        catch  
	//				e.printStackTrace();
	//			}
	//	}
}

좋은 웹페이지 즐겨찾기