본문 바로가기

WEB_Programming/Pure Java

JAVA + SSL Tutorial (server and client examples)

JAVA + SSL Tutorial (server and client examples)  from http://stilius.net/java/java_ssl.php

Certificate 인증

첫번째, 인증을 받을 필요가 있다. 이것은 J2SE SDK 에 있는 keytool을 이용하여 처리한다. (이 프로그램을 실행하면 인증하는 사람의 정보와 비밀번호를 묻게 된다. 이때 123456으로 패스워드를 입력한다.)
 

keytool -genkey -keystore mySrvKeystore -keyalg RSA

인증을 마치고 나면 작업 디렉토리에 키툴에서 발행한 인증 파일을 확인할 수 있다.

Server source code (EchoServer.java)

import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class EchoServer {
    public static void main(String[] arstring) {
   try {
    SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
    SSLServerSocket sslserversocket =
(SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
    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 exception) {
    exception.printStackTrace();
    }
  }
}

다음과 같이 컴파일 한다. Compile it by using simple command:

javac EchoServer.java


Client source code (EchoClient.java)

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
public class EchoClient {
 public static void main(String[] arstring) {
   try {
    SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
   SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 9999);
   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 exception) {
    exception.printStackTrace();
  }
  }
}

      
다음과 같이 컴파일 한다.
javac EchoClient.java

서버와 클라이언트를 SSL을 이용하여 실행한다.

첫번째, 인증 파일을 복사하고, 실행 디렉토리에 복사해 넣는다. 그리고 다음 파라미터를 사용하여 서버를 실행한다. (주의할 것은 인증 파일 생성시에 사용했던 비밀번호 123456 보다는 좀더 믿을수 있는 안전한 비밀번호를 사용하라는 것...)

java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456 EchoServer

그리고 이제 다시 인증 파일을 클라이언트 워킹 디렉토리에 복사한다. 이것 역시 좋은 비밀번호를 사용하는것이 좋다.

java -Djavax.net.ssl.trustStore=mySrvKeystore -Djavax.net.ssl.trustStorePassword=123456 EchoClient

만약 SSL 디버깅 정보를 원한다면 당므 파라미터를 실행시에 추가해주면 된다.

-Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol -Djavax.net.debug=ssl


이제 서버 클라이언트를 수행해서 동작시키고 사용해보자.

이것은 단지 문자열을 콘솔에 타이핑해 넣고 리턴을 누르면 서버 콘솔에 나타나는 아주 단순한 프로그램이다.

Copyright

이 문서는 Tomas Vilda가 저작권을 가지고 잇다. 언제든지 이 코드를 사용할 수 있지만 이 섹션을 변경하지 않아야 하고, 항상 카피라이트를 포함해야한다.

기타 참고 문서
http://guysheep.springnote.com/pages/857612