140 likes | 300 Views
안전한 통신. JSSE (Java Secure Sockets Extension) JSSE 로 안전한 통신을 맺기 위해 필요한 암호과정을 처리하는 소켓과 서버 소켓을 생성 암호 알고리즘은 각국의 보안법에 제한되므로 JDK 에 포함되지 못함 JSSE 라는 이름의 표준 확장 형태로 제공 확장 패키지에 담긴 내용 SSL ( Secure Socket Layer) 버전 3 TLS ( Transport Layer Secure) 프로토콜 JDK 의 부가 패키지. 안전한 통신. 안전한 통신
E N D
안전한 통신 • JSSE (Java Secure Sockets Extension) • JSSE로 안전한 통신을 맺기 위해 필요한 암호과정을 처리하는 소켓과 서버 소켓을 생성 • 암호 알고리즘은 각국의 보안법에 제한되므로 JDK에 포함되지 못함 • JSSE라는 이름의 표준 확장 형태로 제공 • 확장 패키지에 담긴 내용 • SSL ( Secure Socket Layer) 버전 3 • TLS ( Transport Layer Secure) 프로토콜 • JDK 의 부가 패키지
안전한 통신 • 안전한 통신 • 비밀키(대칭키, secret key) • 데이터를 암호화 하고 해독하는데 동일한 키 사용 • 속도가 빠름 • 대칭키 누출시 데이터 공개 • 공개키(비대칭키, public key) • 데이터를 암호화 하고 해독하는데 서로 다른 키 사용 • 공개키는 배포하고 암호 해독용 전용키는 보관 • 비밀성, 인증, 무결성을 모두 얻을 수 있음 • 중간자 공격( man-in-the-middle attack) • 신뢰할 만한 인증 기관에서 공개키를 검사하여 저장하는 방법으로 해결
안전한 통신 • JSSE의 패키지 • javax.net.ssl • 안전한 네트워크 통신을 위한 자바 API를 정의하는 추상 클래스 • javax.net • 안전한 소켓을 생성하기 위해 생성자 대신 사용하는 추상 소켓 팩토리 클래스 • javax.security.cert • SSL에 필요한 공개키 인증을 처리하는 최소한의 클래스 집합 • com.sun.net.ssl • JSSE 에 대해 암호화 알고리즘과 프로토콜을 구현한 클래스
안전한 통신 • 설치 방법 • 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
안전한 클라이언트 소켓 생성하기 • 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, int port, boolean autoClose) throws IOException
안전한 클라이언트 소켓 생성하기 • 안전한 소켓 사용예 • 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( • }
SSLSocket 클래스의 메소드 • 암호 조합 선택하기 • JSSE 는 인증 방법이나 암호화 알고리즘을 서로 다른 암호 조합으로 지원 가능 • public abstract String[] getSupportedCipherSuites() • 주어진 소켓에 대해 어떤 알고리즘의 조합이 사용 가능한지 알려줌 • public abstract String[] getEnabledCipherSuites() • 해당 소켓에서 실제로 사용할 수 있는 암호 조합 • public abstract void setEnabledCipherSuites(String[] suites) • 클라이언트가 사용하려는 조합 바꾸기
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
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
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( )
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( ) • 소켓이 클라이언트 쪽에서 인증 되어야 하게 설정 되었는지 여부를 리턴
안전한 서버 소켓 생성하기 • 안전한 서버 소켓 생성 방법 • 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
안전한 서버 소켓 생성하기 • 안전한 서버 소켓을 생성하기 위한 필요 사항 • keytool 을 이용하여 공개키를 생성하고 인증 • 신뢰할 말한 인증기관이 인증한 인증서를 획득 • 사용할 알고리즘에 해당하는 SSLContext를 생성 • 사용할 인증서에 해당하는 TrustManagerFactory를 생성 • 사용할 키의 타입에 맞는 KeyManagerFactory를 생성 • 키와 인증서 데이터베이스에 대한 keyStore 객체를 생성 • 키와 인증서로 KeyStore객체를 채움 • KeyStore 와 패스 구절로 KeyManagerFactory를 초기화 • KeyManagerFactory 에서 키 매니저를, TrustManagerFactory 에서 신뢰 매니저를, 그리고 무작위의 소스로 컨텍스트를 초기화 함
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( )