SSL EchoServer & Client

예제 파일 다운받기

// 인증서 생성
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 을 보시면 데이터가 보이지 않습니다.
암호화 되었다고 생각됩니다. 자세한 내용은 좀더 공부를 해서 …..

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중