ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SunCertPathBuilderException 에러 - 스프링 이미지 빌드 시 인증서 추가
    JAVA 2024. 4. 11. 16:42

    상황

    - 동일한 K8S 클러스터&네임스페이스에 있는 Spring 서버에서 다른 Spring 서버로 https 요청을 날렸을 때 다음과 같은 에러 발생

    KIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target [2m2024-04-09 05:17:44.652[0;39m [31mERROR[0;39m [35m1[0;39m [2m---[0;39m [2m[io-8080-exec-10][0;39m [36mai.wapl.common.utils.logging.LogAspect [0;39m [2m:[0;39m [988c8df2] [UserService.sendEmailCode(..)] exception occurred. time = 89ms, ex=org.springframework.web.client.ResourceAccessException: I/O error on GET request for <{"data-type":"url","data-url":""https://superapp-auth.teespace.net/auth/realms/foodist-dev/user/<{\"data-type\":\"mail\",\"data-url\":\"mailto:000dasom@naver.com\"}>/exists":"}> PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target [2m2024-04-09 05:17:44.652[0;39m [31mERROR[0;39m [35m1[0;39m [2m---[0;39m [2m[io-8080-exec-10][0;39m

     

    이슈 원인 추정

    - 브라우저에서 서버로 https 요청을 보낼 때 비대칭 암호화 방식을 이용한다. 브라우저에서 public cert 로 암호화를 하고 서버에서 private cert 로 복호화하여 정보를 처리한다. Spring 서버 사이에 통신 할 때 https로 요청을 날리려면 보내는 Spring 서버에 public cert가 있어야 하고 받는 쪽에는 private cert가 있어야 한다. 우리의 상황은 web server 주소를 통해서 Spring 서버로 https 요청을 날렸고 web server에는 private cert가 이미 있기 때문에 https 요청을 보내는 Spring 서버에만 public cert 를 심으면 되는 상황이었다.

     

    1. 브라우저를 통해 public cert 얻기

    Fig 1. 요청 보내려는 도메인으로 접속하여 브라우저에서 인증서에 접근한다.
    Fig 2. 보안에 들어가서 인증서가 유효함을 클릭하면 인증서에 접근 할수 있다.
    Fig 3. DER 방식으로 저장한다.

    2.  Docker image 생성 할 때 Dockerfile에서 keytool 이용해 인증서 추가

    FROM jdk:11
    
    USER root
    COPY ./build/libs/common-0.0.1-SNAPSHOT.jar app.jar
    COPY ./daum.net.cer daum.net.cer
    RUN keytool -importcert -alias daum.net -cacerts -storepass changeit -file /daum.net.cer -noprompt
    ENTRYPOINT ["java","-jar","/app.jar"]
Designed by Tistory.