Java

Java | TrustManager이란? / SSL 인증서 없이 https 통신

이진유진 2024. 2. 29. 14:06
반응형

TrustManager란?

Java에서 SSL/TLS 연결에서 서버의 인증서를 검증하는 데 사용되는 인터페이스입니다. 

SSL/TLS 연결은 데이터의 암호화 및 보안 통신을 위해 사용되며, 서버의 인증서를 신뢰할 수 있는 것으로 확인하는 것이 중요합니다. 

 

TrustManager를 사용하면 클라이언트 애플리케이션이 서버의 인증서를 검증하고, 서버가 신뢰할 만한지 여부를 결정할 수 있습니다. 

TrustManager는 보통 X509 형식의 디지털 인증서에 대한 신뢰 관리를 담당합니다. 

 

  1. X509TrustManager 인터페이스 
    • TrustManager 인터페이스의 하위 인터페이스로, X509 디지털 인증서를 처리합니다. 
    • checkClientTrusted 및 checkServerTrusted 메소드를 제공하여 클라이언트 및 서버의 인증서를 신뢰할 수 있는지 확인할 수 있습니다. 
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class MyTrustManager implements X509TrustManager {
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        // 클라이언트의 인증서를 신뢰할지 여부를 확인하는 로직
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        // 서버의 인증서를 신뢰할지 여부를 확인하는 로직
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }
}

 

 

아래는, SSL 인증서 없이 https 통신하는 법의 예제입니다.

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class GsHttpsClient {

	public static void main(String[] args) {
		String urlStr = "https://www.google.com";
		
		StringBuffer sb = new StringBuffer();

		try {
			TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
				public java.security.cert.X509Certificate[] getAcceptedIssuers() {
					return null;
				}

				public void checkClientTrusted(X509Certificate[] certs,
						String authType) {
				}

				public void checkServerTrusted(X509Certificate[] certs,
						String authType) {
				}
			} };

			SSLContext sc = SSLContext.getInstance("SSL");
			sc.init(null, trustAllCerts, new java.security.SecureRandom());
			HttpsURLConnection
					.setDefaultSSLSocketFactory(sc.getSocketFactory());

			URL url = new URL(urlStr);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();

			InputStreamReader in = new InputStreamReader(
					(InputStream) conn.getContent());
			BufferedReader br = new BufferedReader(in);

			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line).append("\n");
			}

			System.out.println(sb.toString());
			br.close();
			in.close();
			conn.disconnect();

		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}
}
출처: https://bobr2.tistory.com/entry/SSL-인증서-없이-https-통신하는-법-예제 [나만의공간:티스토리]

 

Server Side 방식으로 https를 연결시 기본적으로 인증서가 필요한데, 

인증서 없이 https를 구현하려면 이 방법을 사용하면 됩니다. 

 

위의 코드를 해석해보자면, 아래와 같습니다.

 

  1. TrustManager 인터페이스를 구현한 X509TrustManager 객체를 생성
    • 이 TrustManager는 모든 인증서를 신뢰하도록 구현되어 있습니다. 
    • checkClientTrusted 및 checkServerTrusted 메서드가 비어있어 모든 클라이언트 및 서버 인증서를 허용합니다. 
  2. SSLContext를 생성하고, init 메서드를 통해 앞서 생성한 TrustManager를 등록합니다. 
    • SSLContext는 SSL/TLS 연결을 생성하는데 사용됩니다. 
    • 여기서는 SSL 프로토콜을 사용하도록 설정하고, TrustManager로서 앞서 생성한 객체를 등록합니다. 
  3. HttpURLConnection.setDefaultSSLSocketFactory를 호출하여 기본  SSLSocketFactory를 설정합니다.
    • 이는 모든 HttpURLConnection이 동일한 SSLContext 및 TrustManager를 사용하도록 설정합니다. 
  4. URL을 생성하고, HttpURLConnection을 이용하여 웹 페이지의 내용을 읽습니다. 
    • HttpURLConnection은 기본적으로 앞서 설정한 SSLContext를 사용하여 SSL/TLS 연결을 생성합니다. 
  5. 응답 내용을 읽어서 출력합니다. 

이 코드는 클라이언트가 서버의 인증서를 신뢰하지 않고 무조건적으로 모든 인증서를 신뢰하도록 하기 때문에 보안 문제(중간자 공격)를 일으킬 수 있습니다.

 

 

 

반응형