// 인증서 생성
C:\SSL>keytool -genkey -keystore coozplz -keyalg RSA
keystore 암호를 입력하십시오: 123456
새 암호를 다시 입력하십시오: 123456
이름과 성을 입력하십시오.
[Unknown]: Coozplz
조직 단위 이름을 입력하십시오.
[Unknown]: coozplz
조직 이름을 입력하십시오.
[Unknown]: coozplz
구/군/시 이름을 입력하십시오?
[Unknown]: coozplz
시/도 이름을 입력하십시오.
[Unknown]: coozplz
이 조직의 두 자리 국가 코드를 입력하십시오.
[Unknown]: ko
CN=Coozplz, OU=coozplz, O=coozplz, L=coozplz, ST=coozplz, C=ko이(가) 맞습니까?
[아니오]: y
에 대한 키 암호를 입력하십시오.
(keystore 암호와 같은 경우 Enter를 누르십시오):
C:\SSL>
// 인증서 생성 완료
EchoServer.java
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
public static void main(String[] arstring) {
try {
ServerSocket serverSocket = new ServerSocket(10000);
Socket socket = serverSocket.accept();
InputStream inputstream = socket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(
inputstream);
BufferedReader bufferedreader = new BufferedReader(
inputstreamreader);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
System.out.println(string);
System.out.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
EchoClient.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class EchoClient {
public static void main(String[] arstring) {
try {
Socket socket = new Socket("127.0.0.1", 10000);
InputStream inputstream = System.in;
InputStreamReader inputstreamreader = new InputStreamReader(
inputstream);
BufferedReader bufferedreader = new BufferedReader(
inputstreamreader);
OutputStream outputstream = socket.getOutputStream();
OutputStreamWriter outputstreamwriter = new OutputStreamWriter(
outputstream);
BufferedWriter bufferedwriter = new BufferedWriter(
outputstreamwriter);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
bufferedwriter.write(string + '\n');
bufferedwriter.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
일반의 경우 네트워크 패킷 캡처 도구(WireShark)을 이용하면 패킷의 내용이 보이게 됩니다.
첨부 파일의 EchoClient_126Line.pcap 파일의 126번째 라인을 살펴 보면 ‘hello World’ 라는 텍스트가 보입니다.
제가 전송한 텍스트가 그대로 보입니다..^^
SSL Socket 사용
SSLEchoSerer.java
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
public class SSLEchoServer {
public static void main(String[] arstring) {
try {
int serverPort = 10000;
// 인증서 위치
System.setProperty("javax.net.ssl.keyStore", "c:/ssl/coozplz");
// 인증서 비밀번호
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
/////////////////////////////////////////
// 기존 소켓과 다른 부분
/////////////////////////////////////////
SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory
.getDefault();
SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory
.createServerSocket(serverPort);
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
/////////////////////////////////////////
/////////////////////////////////////////
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(
inputstream);
BufferedReader bufferedreader = new BufferedReader(
inputstreamreader);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
System.out.println(string);
System.out.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SSLEchoClient.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class SSLEchoClient {
public static void main(String[] arstring) {
try {
String serverHost = "127.0.0.1";
int serverPort = 10000;
// 인증서 위치
System.setProperty("javax.net.ssl.trustStore", "c:/ssl/coozplz");
// 인증서 비밀번호
System.setProperty("javax.ssl.trushStorePassword", "123456");
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory
.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
serverHost, serverPort);
InputStream inputstream = System.in;
InputStreamReader inputstreamreader = new InputStreamReader(
inputstream);
BufferedReader bufferedreader = new BufferedReader(
inputstreamreader);
OutputStream outputstream = sslsocket.getOutputStream();
OutputStreamWriter outputstreamwriter = new OutputStreamWriter(
outputstream);
BufferedWriter bufferedwriter = new BufferedWriter(
outputstreamwriter);
String string = null;
while ((string = bufferedreader.readLine()) != null) {
bufferedwriter.write(string + '\n');
bufferedwriter.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
위와 같이 실행한 결과는 첨부파일 SSLEchoServer_211Line.pcap 파일의 211Line 을 보시면 데이터가 보이지 않습니다.
암호화 되었다고 생각됩니다. 자세한 내용은 좀더 공부를 해서 …..