Download presentation
Presentation is loading. Please wait.
1
안전한 통신 JSSE (Java Secure Sockets Extension)
소켓과 서버 소켓을 생성 암호 알고리즘은 각국의 보안법에 제한되므로 JDK에 포함되지 못함 JSSE라는 이름의 표준 확장 형태로 제공 확장 패키지에 담긴 내용 SSL ( Secure Socket Layer) 버전 3 TLS ( Transport Layer Secure) 프로토콜 JDK 의 부가 패키지
2
안전한 통신 안전한 통신 비밀키(대칭키, secret key) 공개키(비대칭키, public key)
데이터를 암호화 하고 해독하는데 동일한 키 사용 속도가 빠름 대칭키 누출시 데이터 공개 공개키(비대칭키, public key) 데이터를 암호화 하고 해독하는데 서로 다른 키 사용 공개키는 배포하고 암호 해독용 전용키는 보관 비밀성, 인증, 무결성을 모두 얻을 수 있음 중간자 공격( man-in-the-middle attack) 신뢰할 만한 인증 기관에서 공개키를 검사하여 저장하는 방법으로 해결
3
안전한 통신 JSSE의 패키지 javax.net.ssl javax.net javax.security.cert
안전한 네트워크 통신을 위한 자바 API를 정의하는 추상 클래스 javax.net 안전한 소켓을 생성하기 위해 생성자 대신 사용하는 추상 소켓 팩토리 클래스 javax.security.cert SSL에 필요한 공개키 인증을 처리하는 최소한의 클래스 집합 com.sun.net.ssl JSSE 에 대해 암호화 알고리즘과 프로토콜을 구현한 클래스
4
안전한 통신 설치 방법 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
5
안전한 클라이언트 소켓 생성하기 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) public abstract Socket createSocket(InetAddress host, int port, public abstract Socket createSocket(Socket proxy, String host, int port, boolean autoClose) throws IOException
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: \r\n"); out.write("Expires: 08/05\r\n"); out.flush( ); out.close( ); socket.close( ); } catch (IOException e) { e.printStackTrace(
7
SSLSocket 클래스의 메소드 암호 조합 선택하기
JSSE 는 인증 방법이나 암호화 알고리즘을 서로 다른 암호 조합으로 지원 가능 public abstract String[] getSupportedCipherSuites() 주어진 소켓에 대해 어떤 알고리즘의 조합이 사용 가능한지 알려줌 public abstract String[] getEnabledCipherSuites() 해당 소켓에서 실제로 사용할 수 있는 암호 조합 public abstract void setEnabledCipherSuites(String[] suites) 클라이언트가 사용하려는 조합 바꾸기
8
SSLSocket 클래스의 메소드 구현하여 제공하는 암호화 알고리즘 기타 암호 조합
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 기타 암호 조합 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
9
SSLSocket 클래스의 메소드 이벤트 핸들러
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
10
SSLSocket 클래스의 메소드 세션관리 세션 관련 메소드 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( )
11
SSLSocket 클래스의 메소드 클라이언트 모드
public abstract void setUseClientMode(boolean mode) throws IllegalArgumentException 이 소켓이 첫번째 핸드셰이킹에서 인증을 해야 하는지 결정 public abstract boolean getUseClientMode( ) 이 소켓이 첫번째 헨드셰이킹에서 인증법을 사용하였는지 여부를 리턴 public abstract void setNeedClientAuth(boolean needsAuthentication) throws IllegalArgumentException 서버에 연결 되어 있는 모든 클라이언트가 스스로를 인증해야 하는지 여부를 설정 public abstract boolean getNeedClientAuth( ) 소켓이 클라이언트 쪽에서 인증 되어야 하게 설정 되었는지 여부를 리턴
12
안전한 서버 소켓 생성하기 안전한 서버 소켓 생성 방법
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 int queueLength, InetAddress interface) throws IOException
13
안전한 서버 소켓 생성하기 안전한 서버 소켓을 생성하기 위한 필요 사항 keytool 을 이용하여 공개키를 생성하고 인증
신뢰할 말한 인증기관이 인증한 인증서를 획득 사용할 알고리즘에 해당하는 SSLContext를 생성 사용할 인증서에 해당하는 TrustManagerFactory를 생성 사용할 키의 타입에 맞는 KeyManagerFactory를 생성 키와 인증서 데이터베이스에 대한 keyStore 객체를 생성 키와 인증서로 KeyStore객체를 채움 KeyStore 와 패스 구절로 KeyManagerFactory를 초기화 KeyManagerFactory 에서 키 매니저를, TrustManagerFactory 에서 신뢰 매니저를, 그리고 무작위의 소스로 컨텍스트를 초기화 함
14
SSLServerSocket 클래스의 메소드
암호 조합 선택하기 어떤 암호 조합을 사용할 수 있는지 결정하는 메소드 public abstract String[] getSupportedCipherSuites( ) public abstract String[] getEnabledCipherSuites( ) public abstract void setEnabledCipherSuites(String[] suites) 세션관리 세션 관리에 관계된 메소드 public abstract void setEnableSessionCreation(boolean allowSessions) public abstract boolean getEnableSessionCreation( ) 클라이언트 모드 클라이언트 모드 관련 메소드 public abstract void setNeedClientAuth(boolean flag) public abstract boolean getNeedClientAuth( ) public abstract void setUseClientMode(boolean flag) public abstract boolean getUseClientMode( )
Similar presentations