본문 바로가기
Stack Overflow/스프링

[스프링] PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException 오류 이슈 대응

by Lich King 2022. 1. 12.

크롬 엔진을 사용하는 환경에서 현재 도메인에서 다른 도메인으로 이동하거나 데이터를 송수신 할 때 이동하는 URL이 부모 URL과 상이하여 하기와 같은 오류 팝업 메시지를 보게 된다.

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException

이 오류 메시지의 원인은 SSL 인증서 적용이 안되었거나, 코딩에 SSL 송수신 루틴을 추가해주지 않아서 그런다.

추가 방법은 앞서 썼던 글을 가면 자세히 볼 수 있다.

 

이동하기 ☞https://baekyle.tistory.com/5

 

[스프링] SSL API 통신 시 SSLHandshakeException & CrossDomain ERROR 오류에 대한 대응을 위한 코딩방법

크롬 브라우저에서 보안 강화 정책으로 이제 다른 도메인과 통신을 지행할 때, SSL 검증을 진행하여 동일한 도메인이 아닌 경우 통신오류를 발생시킨다. 즉, 이전과 다르게 SSL 통신 루틴을 

baekyle.com

해당 오류는 즉 구글 리캡챠(reCAPTCHA), API 데이터 송수신 관련 오류로 인증서 오류이다.

RestTemplate 클래스의 postForObject 메소드를 단순히 사용하는 방식으로는 인증할 수 없다.

이를 처리하기 위해 하기의 루틴을 추가해줘야 한다.

 

1. 요약

1.1 라이브러리 추가

1.2 인증서 추가

1.3 코드 추가

 

2. 라이브러리 추가

- 하기의 라이브러리를 추가해준다.

httpclient-x.x.x.jar
httpcore-x.x.x.jar

3. jks 확장자 인증서 발급받고 라이브러리처럼 솔루션에 이식

- 돈을 받고 사던지 무료로 받던지 해서 jks 인증서를 발급받는다.

 

4. 하기 코딩 추가

ClassPathResource resource = new ClassPathResource("jks확장자 파일명");
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
String keyStorePassword = "jks 확장자 암호";

keyStore.load(new FileInputStream(resource.getFile()), keyStorePassword.toCharArray());
SSLContext sslcontext = SSLContexts.custom()
                    .useProtocol("SSL")
                    .loadTrustMaterial(null, new TrustStrategy() {
                        @Override
                        public boolean isTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) {
                            return true;
                        }
                    }).loadKeyMaterial(keyStore, keyStorePassword.toCharArray())
                    .build();            

SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE);
CloseableHttpClient httpClient = HttpClients.custom()
        .setSSLSocketFactory(csf)
        .build();

        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);           
        RestTemplate restTemplate = new RestTemplate(requestFactory);

상기 코드를 추가하고, 마지막으로 RestTemplate 클래스를 선전해줘서 rest 통신을 진행하면 정상적으로 될 것이다.

잘 이해가 안된다면 맨 위에 있는 링크로 이동해서 더 자세히 보면 된다.

댓글