반응형
TrustManager란?
Java에서 SSL/TLS 연결에서 서버의 인증서를 검증하는 데 사용되는 인터페이스입니다.
SSL/TLS 연결은 데이터의 암호화 및 보안 통신을 위해 사용되며, 서버의 인증서를 신뢰할 수 있는 것으로 확인하는 것이 중요합니다.
TrustManager를 사용하면 클라이언트 애플리케이션이 서버의 인증서를 검증하고, 서버가 신뢰할 만한지 여부를 결정할 수 있습니다.
TrustManager는 보통 X509 형식의 디지털 인증서에 대한 신뢰 관리를 담당합니다.
- 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를 구현하려면 이 방법을 사용하면 됩니다.
위의 코드를 해석해보자면, 아래와 같습니다.
- TrustManager 인터페이스를 구현한 X509TrustManager 객체를 생성
- 이 TrustManager는 모든 인증서를 신뢰하도록 구현되어 있습니다.
- checkClientTrusted 및 checkServerTrusted 메서드가 비어있어 모든 클라이언트 및 서버 인증서를 허용합니다.
- SSLContext를 생성하고, init 메서드를 통해 앞서 생성한 TrustManager를 등록합니다.
- SSLContext는 SSL/TLS 연결을 생성하는데 사용됩니다.
- 여기서는 SSL 프로토콜을 사용하도록 설정하고, TrustManager로서 앞서 생성한 객체를 등록합니다.
- HttpURLConnection.setDefaultSSLSocketFactory를 호출하여 기본 SSLSocketFactory를 설정합니다.
- 이는 모든 HttpURLConnection이 동일한 SSLContext 및 TrustManager를 사용하도록 설정합니다.
- URL을 생성하고, HttpURLConnection을 이용하여 웹 페이지의 내용을 읽습니다.
- HttpURLConnection은 기본적으로 앞서 설정한 SSLContext를 사용하여 SSL/TLS 연결을 생성합니다.
- 응답 내용을 읽어서 출력합니다.
이 코드는 클라이언트가 서버의 인증서를 신뢰하지 않고 무조건적으로 모든 인증서를 신뢰하도록 하기 때문에 보안 문제(중간자 공격)를 일으킬 수 있습니다.
반응형
'Java' 카테고리의 다른 글
Java | 정적 팩토리 메서드(Static Factory Method) (0) | 2024.03.04 |
---|---|
Java | Document Class / Element Class / Jsoup 크롤링 예제 코드 (0) | 2024.02.29 |
Java | JSONObject 클래스란? (0) | 2024.02.29 |
Java | HttpRequestHandler란? (0) | 2024.02.29 |
Java | 클래스, 객체, 메소드, 생성자(Class, Object, Method, Constructor) (1) | 2024.01.31 |