안전한 통신

14
1 안안안 안안 I. JSSE (Java Secure Sockets Extension) JSSE 로 로로로 로로로 로로 로로 로로로 로로로로로 로로로로 로로로 로로 로로로 로로 로로 로로로로로 로로로 로로로로 로로로로로 JDK 로 로로로로 로로 JSSE 로로 로로로 로로 로로 로로로 로로 로로 로로로로 로로 로로 SSL ( Secure Socket Layer) 로로 3 TLS ( Transport Layer Secure) 로로로로 JDK 로 로로 로로로

Upload: rachel-puckett

Post on 30-Dec-2015

52 views

Category:

Documents


0 download

DESCRIPTION

안전한 통신. JSSE (Java Secure Sockets Extension) JSSE 로 안전한 통신을 맺기 위해 필요한 암호과정을 처리하는 소켓과 서버 소켓을 생성 암호 알고리즘은 각국의 보안법에 제한되므로 JDK 에 포함되지 못함 JSSE 라는 이름의 표준 확장 형태로 제공 확장 패키지에 담긴 내용 SSL ( Secure Socket Layer) 버전 3 TLS ( Transport Layer Secure) 프로토콜 JDK 의 부가 패키지. 안전한 통신. 안전한 통신 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 안전한 통신

1

안전한 통신안전한 통신

I. JSSE (Java Secure Sockets Extension)

JSSE 로 안전한 통신을 맺기 위해 필요한 암호과정을 처리하는소켓과 서버 소켓을 생성

암호 알고리즘은 각국의 보안법에 제한되므로 JDK 에 포함되지 못함 JSSE 라는 이름의 표준 확장 형태로 제공

확장 패키지에 담긴 내용 SSL ( Secure Socket Layer) 버전 3 TLS ( Transport Layer Secure) 프로토콜 JDK 의 부가 패키지

Page 2: 안전한 통신

2

안전한 통신안전한 통신

II. 안전한 통신 비밀키 ( 대칭키 , secret key)

데이터를 암호화 하고 해독하는데 동일한 키 사용 속도가 빠름 대칭키 누출시 데이터 공개

공개키 ( 비대칭키 , public key) 데이터를 암호화 하고 해독하는데 서로 다른 키 사용 공개키는 배포하고 암호 해독용 전용키는 보관 비밀성 , 인증 , 무결성을 모두 얻을 수 있음 중간자 공격 ( man-in-the-middle attack)

– 신뢰할 만한 인증 기관에서 공개키를 검사하여 저장하는 방법으로 해결

Page 3: 안전한 통신

3

안전한 통신안전한 통신

III. JSSE 의 패키지 javax.net.ssl

안전한 네트워크 통신을 위한 자바 API 를 정의하는 추상 클래스

javax.net 안전한 소켓을 생성하기 위해 생성자 대신 사용하는 추상 소켓 팩토리 클래스

javax.security.cert SSL 에 필요한 공개키 인증을 처리하는 최소한의 클래스 집합

com.sun.net.ssl JSSE 에 대해 암호화 알고리즘과 프로토콜을 구현한 클래스

Page 4: 안전한 통신

4

안전한 통신안전한 통신

IV. 설치 방법 JSSE 다운로드

http://java.sun.com/products/jsse/ 에서 JSSE 를 다운로드

아카이브 복사 Jre/lib/ext 디렉토리로 이동 ( 또는 클래스 패스 설정 ) 필요한 아카이브

– Jcert.jar, jnet.jar, jsse.jar

jre/lib/ext/security/java.security 파일 편집 security.provider.1=sun.security.provider.Sun security.provider.2=com.sun.rsajca.Provider 위의 두줄을 찾고 아래의 한줄을 추가 security.provider.3=com.sun.net.ssl.internal.ssl.Provider

Page 5: 안전한 통신

5

안전한 클라이언트 소켓 생성하기안전한 클라이언트 소켓 생성하기

I. Socket 객체 생성하기 public abstract class SSLSocketFactory extends SocketFactory 사용 SSLSocketFactory.getDefault() 메소드를 사용

Public static SocketFactory getDefault() throws InstantiationException

createSocket() 메소드 public abstract Socket createSocket(String host, int port)

throws IOException, UnknownHostException public abstract Socket createSocket(InetAddress host, int port)

throws IOException public abstract Socket createSocket(String host, int port,

InetAddress interface, int localPort)throws IOException, UnknownHostException

public abstract Socket createSocket(InetAddress host, int port,InetAddress interface, int localPort)throws IOException, UnknownHostException

public abstract Socket createSocket(Socket proxy, String host, intport, boolean autoClose) throws IOException

Page 6: 안전한 통신

6

안전한 클라이언트 소켓 생성하기안전한 클라이언트 소켓 생성하기

안전한 소켓 사용예

try {

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider( ));

SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault( );

Socket socket = factory.createSocket("login.metalab.unc.edu", 7000);

Writer out = new OutputStreamWriter(socket.getOutputStream( ), "ASCII");

out.write("Name: John Smith\r\n");

out.write("Product-ID: 67X-89\r\n");

out.write("Address: 1280 Deniston Blvd, NY NY 10003\r\n");

out.write("Card number: 4000-1234-5678-9017\r\n");

out.write("Expires: 08/05\r\n");

out.flush( );

out.close( );

socket.close( );

}

catch (IOException e) {

e.printStackTrace(

}

Page 7: 안전한 통신

7

SSLSocket 클래스의 메소드SSLSocket 클래스의 메소드

I. 암호 조합 선택하기

JSSE 는 인증 방법이나 암호화 알고리즘을 서로 다른 암호 조합으로 지원 가능

public abstract String[] getSupportedCipherSuites() 주어진 소켓에 대해 어떤 알고리즘의 조합이 사용 가능한지 알려줌

public abstract String[] getEnabledCipherSuites() 해당 소켓에서 실제로 사용할 수 있는 암호 조합

public abstract void setEnabledCipherSuites(String[] suites) 클라이언트가 사용하려는 조합 바꾸기

Page 8: 안전한 통신

8

SSLSocket 클래스의 메소드SSLSocket 클래스의 메소드

II. 구현하여 제공하는 암호화 알고리즘 SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA SSL_RSA_EXPORT_WITH_RC4_40_MD5 SSL_RSA_WITH_NULL_MD5 SSL_RSA_WITH_NULL_SHA SSL_DH_anon_EXPORT_WITH_RC4_40_MD5

III. 기타 암호 조합 SSL_DH_anon_WITH_DES_CBC_SHA SSL_DH_anon_WITH_3DES_EDE_CBC_SHA SSL_DHE_DSS_WITH_DES_CBC_SHA SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_RC4_128_MD5 SSL_RSA_WITH_RC4_128_SHA SSL_RSA_WITH_DES_CBC_SHA SSL_RSA_WITH_3DES_EDE_CBC_SHA SSL_DH_anon_WITH_RC4_128_MD5

Page 9: 안전한 통신

9

SSLSocket 클래스의 메소드SSLSocket 클래스의 메소드

IV. 이벤트 핸들러

public interface HandshakeCompletedListener extends java.util.EventListener

이벤트 정보를 얻기 위한 메소드 public SSLSession getSession( ) public String getCipherSuite( ) public X509Certificate[] getPeerCertificateChain( ) throws

SSLPeerUnverifiedException public SSLSocket getSocket( )

등록하기 위한 메소드 public abstract void addHandshakeCompletedListener( HandshakeCompletedListener listener) public abstract void removeHandshakeCompletedListener( HandshakeCompletedListener listener) throws IllegalArgumentException

Page 10: 안전한 통신

10

SSLSocket 클래스의 메소드SSLSocket 클래스의 메소드

V. 세션관리

세션 관련 메소드

public byte[] getId( ) public SSLSessionContext getSessionContext( ) public long getCreationTime( ) public long getLastAccessedTime( ) public void invalidate( ) public void putValue(String name, Object value) public Object getValue(String name) public void removeValue(String name) public String[] getValueNames( ) public X509Certificate[] getPeerCertificateChain( ) throws

SSLPeerUnverifiedException public String getCipherSuite( ) public String getPeerHost( )

Page 11: 안전한 통신

11

SSLSocket 클래스의 메소드SSLSocket 클래스의 메소드

VI. 클라이언트 모드

public abstract void setUseClientMode(boolean mode) throws IllegalArgumentException

이 소켓이 첫번째 핸드셰이킹에서 인증을 해야 하는지 결정

public abstract boolean getUseClientMode( ) 이 소켓이 첫번째 헨드셰이킹에서 인증법을 사용하였는지 여부를 리턴

public abstract void setNeedClientAuth(boolean needsAuthentication)throws IllegalArgumentException

서버에 연결 되어 있는 모든 클라이언트가 스스로를 인증해야 하는지 여부를 설정

public abstract boolean getNeedClientAuth( ) 소켓이 클라이언트 쪽에서 인증 되어야 하게 설정 되었는지 여부를 리턴

Page 12: 안전한 통신

12

안전한 서버 소켓 생성하기안전한 서버 소켓 생성하기

I. 안전한 서버 소켓 생성 방법 public abstract class SSLServerSocketFactory

extends ServerSocketFactory 에서 생성

SSLServerSocketFactory 의 createServerSocket() 메소드 public abstract ServerSocket createServerSocket(int port) throws

IOException public abstract ServerSocket createServerSocket(int port,

int queueLength) throws IOException public abstract ServerSocket createServerSocket(int port,

int queueLength, InetAddress interface) throws IOException

Page 13: 안전한 통신

13

안전한 서버 소켓 생성하기안전한 서버 소켓 생성하기

II. 안전한 서버 소켓을 생성하기 위한 필요 사항

keytool 을 이용하여 공개키를 생성하고 인증 신뢰할 말한 인증기관이 인증한 인증서를 획득 사용할 알고리즘에 해당하는 SSLContext 를 생성 사용할 인증서에 해당하는 TrustManagerFactory 를 생성 사용할 키의 타입에 맞는 KeyManagerFactory 를 생성 키와 인증서 데이터베이스에 대한 keyStore 객체를 생성 키와 인증서로 KeyStore 객체를 채움 KeyStore 와 패스 구절로 KeyManagerFactory 를 초기화 KeyManagerFactory 에서 키 매니저를 , TrustManagerFactory 에서 신뢰 매니저를 ,

그리고 무작위의 소스로 컨텍스트를 초기화 함

Page 14: 안전한 통신

14

SSLServerSocket 클래스의 메소드SSLServerSocket 클래스의 메소드

I. 암호 조합 선택하기 어떤 암호 조합을 사용할 수 있는지 결정하는 메소드

public abstract String[] getSupportedCipherSuites( ) public abstract String[] getEnabledCipherSuites( ) public abstract void setEnabledCipherSuites(String[] suites)

II. 세션관리 세션 관리에 관계된 메소드

public abstract void setEnableSessionCreation(boolean allowSessions) public abstract boolean getEnableSessionCreation( )

III. 클라이언트 모드 클라이언트 모드 관련 메소드

public abstract void setNeedClientAuth(boolean flag) public abstract boolean getNeedClientAuth( ) public abstract void setUseClientMode(boolean flag) public abstract boolean getUseClientMode( )