더 나은 개발자가 되고싶다..

PKIX path building failed 무시하기 본문

코딩/Web

PKIX path building failed 무시하기

오맹이 2021. 6. 25. 15:12

프로젝트 개발 중 api 테스트를 해야하는데

내부망에서 개발을 하면 restfulAPI 호출시 

 

PKIX path building failed 블라블라

 

이런식의 에러를 볼 수 있다..

 

원인은 SSL 인증서 정보가 현재 JVM 의 신뢰하는 인증기관 인증서 목록에 등록되어 있지 않기때문이라고 하는데 

구글링을 해보면 해결 방법이 많이 나온다.

 

나는 그 중에 SSL 무시하여 호출하는 방법으로 테스트를 진행했다.

 

먼저 해방 방법은 보안 이슈가 생길 수 있으며, 앱의 경우 배포 리젝당할 수 있다..단순 테스트 용도로만 사용하길 권장한다..

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

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

public class aipCall {
	public static void main(String[] args) throws Exception{
		
		String url = "api URL 입력";
		String resultData = "";
		try {
			URL aURL = new URL(url);
			if (aURL.getProtocol().equals("https")) {
				resultData = httpsGet(url);
				System.out.println("https resultData: "+ resultData);
			}
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		
		
	}
	
	public static String httpsGet(String strURL)throws Exception{
		
		URL url = null;;
		HttpsURLConnection conn = null;
		String ret = new String();
		
		try {
			url = new URL(strURL);
			ignoreSSL();
			conn = (HttpsURLConnection) url.openConnection();
			
			BufferedReader br = null;
			br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

			String input = null;
			
			while((input = br.readLine())!=null){
				ret += input;
			}
			
			br.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				conn.disconnect();
			}
		}
		
		return ret;
	}
	
	public static void ignoreSSL()throws Exception{
		HostnameVerifier hv = new HostnameVerifier(){
			public boolean verify(String urlHostName, SSLSession session){
				return true;
			}
		};
		
		trustAllHttpsCertificates();
		HttpsURLConnection.setDefaultHostnameVerifier(hv);
		
	}
	
	private static void trustAllHttpsCertificates() throws Exception{
		TrustManager[] trustAllCerts = new TrustManager[1];
		TrustManager tm = new miTM();
		trustAllCerts[0] = tm;
		SSLContext sc = SSLContext.getInstance("SSL");
		sc.init(null, trustAllCerts, null);
		HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
	}
	
	static class miTM implements TrustManager,X509TrustManager{
		public X509Certificate[] getAcceptedIssuers(){
			return null;
		}
		
		public boolean isServerTrusted(X509Certificate[] certs){
			return true;
		}
		
		public boolean isClientTrusted(X509Certificate[] certs){
			return true;
		}
		
		public void checkServerTrusted(X509Certificate[] certs, String authType)throws CertificateException{
			return;
		}
		
		public void checkClientTrusted(X509Certificate[] certs, String authType)throws CertificateException{
			return;
		}
	}
}

단순하게 콘솔에서 응답을 보고싶었기 때문에 main에서 실행했다.

 

참조 블로그

https://ram2ram2.tistory.com/16

 

https://goddaehee.tistory.com/268

 

'코딩 > Web' 카테고리의 다른 글

ckeditor5 사이즈 조절  (0) 2019.02.12