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에 따라 라이센스가 부여됩니다.