본문 바로가기

JAVA

[JAVA] HTTPS 요청 시 SSL 인증서 오류 무시하기

728x90
반응형

PKIX path building failed 오류 해결법

자바 https 통신 시도 시 다음과 같은 에러가 발생하는 경우

 

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

 

 

원인은 간단히 말해서 Java의 신뢰하는 인증서 목록(keystore)에 사용하고자 하는 인증기관이 등록되어 있지 않아 접근이 차단되는 현상이다.

 

1. 다음 사이트에 인증서를 추가하는 여러가지 방법이 나와 있다.

https://www.lesstif.com/pages/viewpage.action?pageId=12451848

 

2. 위 사이트 방법대로 신뢰할 수 있는 인증서 목록에 추가하여도 접근이 안되는 경우가 있는 경우는

https 대신 http로 코드를 수정하는 것이다.

 

3. Java 코드로 인증서 무시 하기

 

SSL 인증서 없이 https 통신하는 법 예제

Server SIde 방식으로 https를 연결할려면 기본적으로 인증서가 필요한것으로 나오고 있다.
인증서 없이 https를 구현 할려면 아래와 같이 하면 가능하다.

 

/**
* 이미지 URL 저장하기
*/
public static JSONObject imageUrlDown(String imageUrl, String fileName, int count, String currentTime) throws Exception {
   
   BufferedImage bi = null;
   JSONObject object = new JSONObject();

   if (StringUtils.isNotBlank(imageUrl)) {

      if (log.isDebugEnabled()) {
         log.debug("다운로드 할 이미지 URL = " + imageUrl);
      }

     String contentType = null;
        try {
           //SSL 무시하기
           TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
             public 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());
         //end

         URL url = new URL(imageUrl); // 다운로드 할 이미지 URL
         URLConnection con = url.openConnection();
         HttpURLConnection httpURLConnection = (HttpURLConnection) con;

         if (httpURLConnection.getResponseCode() == 200) {
            contentType = httpURLConnection.getContentType().split("/")[1];
            if ("jpeg".equalsIgnoreCase(contentType)) {
               contentType = "jpg";
            }
         }

         File saveFile = new File();
         saveFile.getParentFile().mkdirs();

         if (log.isDebugEnabled()) {
            log.debug("contentType = " + contentType);
            log.debug("saveFile = " + fileName + "." + contentType);
         }

         if (saveFile.isDirectory()) {
            saveFile.mkdirs();
         } else {
            try {
               bi = ImageIO.read(url);
               ImageIO.write(bi, contentType, saveFile); // 저장할 파일 형식, 저장할 파일명

               if (log.isDebugEnabled()) {
                  log.debug("saveFile.getAbsolutePath() = " + saveFile.getAbsolutePath());
                  log.debug("saveFile.getPath() = " + saveFile.getPath());
               }

         } catch (MalformedURLException e) {
            log.error("이미지를 찾을 수 없습니다.");
         } catch (IOException e) {
            log.error("파일 업로드 에러 발생");
         }
     }

   } catch (Exception e) {
      log.error("이미지 다운로드 에러 URL : " + imageUrl);
      log.error("이미지 다운로드 에러 발생 : " + e.getMessage());
   }
}
   return object;
}

 
 

 

728x90
반응형

'JAVA' 카테고리의 다른 글

[JAVA] POI 엑셀파일 생성시, "XXX의 내용에 문제가 있습니다."  (2) 2020.07.28
[JAVA] 이미지 업로드하기  (0) 2020.06.12
[Java] 객체지향 생활 체조  (0) 2020.02.25
[Java] Rest API  (0) 2020.02.21
[Java] DAO,DTO,Entitiy Class  (0) 2020.02.16