본문 바로가기

Dev/JAVA

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

728x90
반응형

centos에서 설치된 자바 버전은 1.8.x 오래되었다 보니. 문제가 생기는게 하나둘씩 ㅜ.ㅜ 

방법을 찾아봐야지..

 

rest로 내 서버에 ssl을 호출하는데 왜 이런 오류가 ㅜㅜ

 

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

이 오류는 Java의 SSL 인증 과정에서 신뢰할 수 없는 인증서 또는 유효하지 않은 인증 경로 때문에 발생합니다. 해결 방법을 단계별로 설명해 드리겠습니다.

 

728x90

 

반응형

1. 인증서 확인을 해야 함.

openssl s_client -connect <check domain>:443 -showcerts

 

2. 인증서 다운로드 및 신뢰 저장소 추가

2-1) 인증서 다운로드

echo -n | openssl s_client -connect <check domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <check_domain>-cert.crt

 

2-2)JAVA 신뢰 저장소(TrustStore) 추가 

keytool -import -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt -alias domain-cert -file domain-cert.crt

 

 

3. 자바 rest 호출 부분 수정

import javax.net.ssl.*;
import java.security.cert.X509Certificate;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.conn.ssl.NoopHostnameVerifier;

public class RestTemplateConfig {

    public static RestTemplate createUnsecureRestTemplate() throws Exception {
        TrustManager[] trustAllCertificates = new TrustManager[]{
            new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() { return null; }
                public void checkClientTrusted(X509Certificate[] certs, String authType) { }
                public void checkServerTrusted(X509Certificate[] certs, String authType) { }
            }
        };

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustAllCertificates, new java.security.SecureRandom());

        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLContext(sslContext)
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();

        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
        return new RestTemplate(factory);
    }
}

 

4. 이후 호출을 하니 문제 없이 해결 ㅜ.ㅜ 

하..

삽질의 끝은 아직도 ㅜ.ㅜ

 

버전 업데이트를 하기에는.. 서버가 불안하니 답답하네 ㅎㅎ

 

728x90
반응형

'Dev > JAVA' 카테고리의 다른 글