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(); // } // } }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.