자바 암호 화 복호화(3)SSL 기반 Socket 통신
클 라 이언 트 인증 서버,즉 현재 클 라 이언 트 가 연 결 된 서버 가 신뢰 할 수 있 는 지 판단 합 니 다.
클 라 이언 트 가 SSL 을 사용 하여 사이트 서버 에 요청 을 보 낼 때 서버 는 클 라 이언 트 에 인증 서 를 보 냅 니 다.클 라 이언 트 는 설 치 된 인증 서 를 사용 하여 서버 신분 을 검증 한 다음 IP 주소(호스트 이름)가 클 라 이언 트 와 연 결 된 호스트 와 일치 하 는 지 확인 합 니 다.클 라 이언 트 는 대화 에 사용 할 비밀 키(세 션 키 라 고 함)를 만 들 고 서비스 자의 공개 키 로 암호 화하 여 서비스 자 에 게 보 냅 니 다.서비스 자 는 자신의 비밀 키 로 복호화 한 다음 클 라 이언 트 와 같은 개인 세 션 키 를 사용 합 니 다.보통 이 단계 에서 RSA 알고리즘 을 사용한다.
그 다음 에 클 라 이언 트 와 서버 측은 개인 세 션 키 와 비밀 키 알고리즘(보통 RC4)을 사용 하여 통신 을 한다.다른 키 의 메시지 인증 코드 를 사용 하여 메시지 의 완전 성 을 확보 합 니 다.
JSSE 를 사용 하여 고객 과 서버 측의 안전 한 통신 을 실현 하 는 절 차 는 다음 과 같다.
1.서버 쪽 키 라 이브 러 리 만 들 기,디지털 인증서 만 들 기
(a)서버 엔 드 키 라 이브 러 리 만 들 기
keytool.exe -genkeypair -v -alias sslsocket -keyalg RSA -keystore e:\keytool\sslsocket.keystore
keystore :
:
?
[Unknown]: lcl
?
[Unknown]: hansky
?
[Unknown]: sts
?
[Unknown]: bj
?
[Unknown]: bj
[Unknown]: zh
CN=lcl, OU=hansky, O=sts, L=bj, ST=bj, C=zh ?
[ ]: y
1,024 RSA (SHA1withRSA)( 90 ):
CN=lcl, OU=hansky, O=sts, L=bj, ST=bj, C=zh
<sslsocket>
( keystore , ):
[ e:\keytool\sslsocket.keystore]
(b)키 라 이브 러 리 정보 보기
keytool.exe -list -v -alias sslsocket -keystore e:\keytool\sslsocket.keystore
(c)인증서 작성
인증 서 를 만 드 는 것 은 키 라 이브 러 리 에서 특정 별명 을 출력 하 는 인증서 입 니 다.인증서 파일 sslsocket.cer 에 저장 합 니 다.
keytool.exe -exportcert -v -alias sslsocket -file e:\keytool\sslsocket.cer -keystore e:\keytool\sslsocket.keystore
keystore :
<e:\keytool\sslsocket.cer>
(d)인증서 파일 정보 보기
keytool.exe -printcert -v -file e:\keytool\sslsocket.cer
2.서버 쪽 인증 서 를 클 라 이언 트 키 라 이브 러 리 에 저장 하여 클 라 이언 트 가 서버 쪽 인증 서 를 받 아 검증 할 수 있 도록 합 니 다.
(a)인증서 가 져 오기
keytool.exe -importcert -v -alias sslsocketcer -file e:\keytool\sslsocket.cer -keystore e:\keytool\sslclient.keystore
keystore :
:CN=lcl, OU=hansky, O=sts, L=bj, ST=bj, C=zh
:CN=lcl, OU=hansky, O=sts, L=bj, ST=bj, C=zh
:4ce5e012
: Fri Nov 19 10:25:22 CST 2010 Thu Feb 17 10:25:22 CST 2011
:
MD5:A3:8E:D8:83:4B:FC:12:30:36:0F:E3:F8:3C:EB:CE:74
SHA1:E3:B8:FB:D3:98:FB:FB:63:D8:BC:A9:F9:AA:F4:FE:8A:54:CC:B6:4B
:SHA1withRSA
: 3
? [ ]: y
keystore
[ e:\keytool\sslclient.keystore]
(b)삭제 하려 면
keytool.exe -delete -alias sslsocketcer -keystore e:\keytool\sslclient.keystore
(c)인증서 정보 보기
keytool.exe -list -v -keystore e:\keytool\sslclient.keystore
3.서버 쪽 보안 소켓 대상 만 들 기
public class TestSSLSocketServer {
private static String path = "e:\\keytool\\sslsocket.keystore";
private static char[] password = "aaaaaaa".toCharArray();
/**
* @param args
*/
public static void main(String[] args) {
boolean flag = true;
SSLContext context = null;
try {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(path), password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
KeyManager[] km = kmf.getKeyManagers();
context = SSLContext.getInstance("SSL");
context.init(km, null, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
SSLServerSocketFactory ssf = (SSLServerSocketFactory) context.getServerSocketFactory();
try {
SSLServerSocket ss = (SSLServerSocket) ssf.createServerSocket(8000);
System.out.println(" 。。。");
while (flag) {
Socket s = ss.accept();
System.out.println(" ");
ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
os.writeObject("echo : Hello");
os.flush();
os.close();
System.out.println();
s.close();
}
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.클 라 이언 트 와 서버 측 이 연 결 된 Socket 대상 만 들 기
public class TestSSLSocketClient {
private static String path = "e:\\keytool\\sslclient.keystore";
private static char[] password = "aaaaaaa".toCharArray();
/**
* @param args
*/
public static void main(String[] args) {
SSLContext context = null;
try {
KeyStore ts = KeyStore.getInstance("JKS");
ts.load(new FileInputStream(path), password);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ts);
TrustManager [] tm = tmf.getTrustManagers();
context = SSLContext.getInstance("SSL");
context.init(null, tm, null);
} catch (...... e) { //
e.printStackTrace();
}
SSLSocketFactory ssf = context.getSocketFactory();
try {
SSLSocket ss = (SSLSocket) ssf.createSocket("localhost", 8000);
System.out.println(" 。");
ObjectInputStream br = new ObjectInputStream(ss.getInputStream());
try {
System.out.println(br.readObject());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
br.close();
ss.close();
System.out.println(" ok");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.