외부에서 API호출 시 오류가 난다.

검색해 보니 SSL 인증서 문제인 거 같다.

 

환경이 복잡하다.

SSL nginx 세팅은 인프라팀, API 외주 개발, API 호출 타 팀에서 호출

 

다들 핑퐁...

인프라 팀은 SSL 인증서 및 설정에는 문제없다

외주 톰캣에 로그 들어오는 게 없다.

타 팀 호출이 안된다.

 

중간에 소통하는데 짜증이... ㅜ3ㅜ

그냥 내가 다하고 싶다. 원인은 SSL 인증서 문제인 거 같은데....

 

구글 검색해 보니

웹브라우저에서 SSL 인증서 적용된 https:// 웹사이트 호출(접근) 시, 웹서버에 SSL 인증서 설치 적용 시 '루트/체인(중개)'을 누락하고 '서버인증서'만 적용했기 때문입니다. (CSR 직접 생성 후, jks 파일을 직접 생성, 조합 과정에서 루트/체인 포함 누락) 나와서요

 문제라고 한다... 우선 방법은 2가지가 있다.

 

1. SSL 인증서를 추출해서 Java VM 등록

2. JAVA에서 SSL 인증서 무시하고 호출

 

1번은 Java 설치 및 설정을 인프라팀에서 하고 있어서 2번으로 작업하기로하였다.

인프라에서 처리해주면 될 거 같은데..

1번은  https://ssow93.tistory.com/73

 

[에러] PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certificati

🚫 SSL 인증서 등록 관련 에러 발생 고객사 쪽의 API를 호출을 하고 있었는데, 이 사이트에 https를 적용하면서 정상적으로 호출이 되지 않고 아래와 같은 에러가 발생하였다. 이에 관련해서 조치

ssow93.tistory.com

 참조하면 될 거 같다.

 

2번은 JAVA로 작성해서 API호출하는 팀에 공유하였다.

 @Test
    public void getFranchiseSearch() throws Exception  {

        //SSL 무시하기 start
        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("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());
        // SSL 무시 end

        URL url = new URL("{URL}");
        HttpURLConnection  con = (HttpURLConnection)url.openConnection();

        // 서버에서 온 데이터를 출력할 수 있는 상태인지
        con.setDoOutput(true);
        // GET/POST
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "application/json; utf-8");
        con.setRequestProperty("Accept", "application/json");

        String jsonInputString = "{\"searchTxt\":\"강남구\"}";
        // 서버로 전송할 JSON 형식의 문자열을 정의
        try(OutputStream os = con.getOutputStream()) {
            byte[] input = jsonInputString.getBytes("utf-8"); // JSON 문자열을 바이트 배열로 변환
            os.write(input, 0, input.length); // 변환된 바이트 배열을 출력 스트림을 통해 전송
        }

        int responseCode = con.getResponseCode(); // 서버로부터 받은 HTTP 응답 코드를 가져옴
        System.out.println("Response Code : " + responseCode); // 응답 코드를 콘솔에 출력

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); // 서버로부터의 응답을 읽기 위한 BufferedReader를 생성
        String inputLine;
        StringBuffer response = new StringBuffer(); // 서버 응답을 저장할 StringBuffer 객체를 생성

        while ((inputLine = in.readLine()) != null) { // 서버 응답의 끝까지 한 줄씩 읽어 들임
            response.append(inputLine); // 읽은 데이터를 StringBuffer 객체에 추가
        }
        in.close(); // BufferedReader를 닫아 리소스를 해제

        System.out.println(response.toString());  // 받은 JSON 응답을 콘솔에 출력

    }

 

정상 호출 된다.