본문 바로가기

Programming/Linux

SSLHandshakeException: PKIX path building failed 에러 해결 방법 (인증서오류)

반응형

회사에서 매일 공공기관에서 제공하는 API를 연동하여 데이터를 가져와 가공하는 작업을 하는데 SSLHandshakeException: PKIX path building failed SSL 인증서 오류가 발생하여 연결이 안돼 해당 배치 프로세스가 비정상 종료되었다. 이에 내가 대응하여 리눅스 환경 및 자바 애플리케이션에서 SSL인증서 교체 후 API URL 정상 연동 방법을 기록하겠다. 


1. 인증서 확인

서버 내 내가 접근할 API URL의 전용 인증서가 유효한지 아래 명령어로 확인

oepnssl s_client -connect 접속URL:포트번호

 

Unable to get local issuer certificate : 중간 체인 인증서 오류

Unable to verify the first certificate : 루트 인증서 오류

맨 하단의 Verify return code: 0 (ok) 가 나와야만 정상 연동 가능한 인증서로 봄

 

2. 인증서 교체 

접근 URL을 제공하는 곳에 문의하여 인증서 교체작업 유무를 확인해야한다.

작업이 있었다면 서버 인증서 및 체인, 루트 인증서 교체도 이루어졌는지 확인

 

2.1 서버인증서만 교체 했을 경우

  • 아래 명령어로 인증서 파일 위치 확인
strace openssl s_client -connect 접근URL:포트 2>&1 | grep '찾을파일명'

 

cert.pem의 위치

 

ca-bundle.crt의 위치

 

해당 디렉토리로 이동한 뒤 서버에서 제공하는 인증서 certlog 파일 이름으로 저장하는 명령어 실행

위에 2 파일에 해당하는 디렉토리에 편집 권한이 없다면 권한이 존재하는 디렉토리로 파일 복사하여 아래 모든 단계 진행 후 다시 해당 폴더로 붙여넣기 해야한다.

 

  • API 서버에서 제공하는 인증서 받아오기
 openssl s_client -connect 접속URL:포트번호  |tee certlog

 

  • certlog 파일에서 인증서 교체에 필요한 부분만 certdata 파일명으로 추출
openssl x509 -inform PEM -in certlog -text -out certdata

 

  • 제대로 추출되었는지 출력확인
openssl x509 -inform PEM -text -in certdata

 

 

출력 확인 시 이런 내용이 아래와 같이 출력된다.

-----BEGIN CERTIFICATE-----

     인증서 KEY 내용 정보

-----END CERTIFICATE-----

 

 

위에 표시된 내용을 전부 복사 후 위치 확인했던 ca-bundle-crt / cert.pem 파일 2개를 하나씩 열어 맨아래 부분에 붙여넣기 후 저장한다.

리눅스에서 파일 편집은 vi 파일명 명령어로 진행하면 되고 윈도우의 경우 메모장형식으로 오픈하여 편집해도된다.

디렉토리 내 권한이 없어 다른 디렉토리에서 작업했다면 기존 위치로 파일 복사 붙여넣기 하여 연결 테스트 진행(기존 인증서 파일은 백업 권장)

openssl s_client -connect 접속URL:포트번호

 

맨 하단 return code: 0 (ok) 출력 시 수정한 인증서가 유효하다는 뜻

API URL 날려보면 정상 연동 확인되었다.


2.2 체인/루트 인증서도 교체 했을 경우

해당 API를 제공하는 업체에 유선연락 혹은 다른방법을 동원하여 체인인증서와 루트인증서를 받아야한다.

1번에서 진행한 서버인증서 교체 먼저 진행한 뒤 체인/루트 인증서 교체 진행해야한다.

CA_GLOBALSIGN.crt (루트인증서), ChainFile_ChainBundle.crt (체인인증서)

 

  • ca-bundle.crt / cert.pem 수정

1번에서 받은 서버 인증서와 API제공업체에서 받은 루트,체인인증서의 내용을 두 인증서 파일내용안에 붙여넣기 해야한다.

서버(certdata) -> 체인(ChainFile_ChainBundle.crt) ->루트(CA_GLOBALSIGN.crt) 순으로 저장해야 함. 

순서를 다르게 붙여놓은 경우 연결 실패할 수 있다.

앞서 서버인증서 교체한 방식과 같이 BEGIN CERTIFICATE ~ END CERTIFICATE 내용 순서대로 복사 진행

 

수정한 인증서가 유효한지 아래 명령어로 확인

openssl s_client -connect 접근URL:포트번호

 

맨 하단 return code: 0 (ok) 출력 시 수정한 인증서가 유효하다는 뜻

 

이제 리눅스 내에서 API연동 시 정상 연동이 되었다.

그치만 JAVA를 이용하여 배치(애플리케이션)에서 실행했을 때 오류가 발생하는 경우가 있다..


3. 애플리케이션에서 실행했을 때 오류 해결 방법

서버에선 운영체제 내 설치된 인증저장소를 사용하여 연동 OK처리

  • JAVA 애플리케이션은 자체 인증서 저장소를 사용. (운영 체제의 인증서 저장소를 사용하지 않음)
  • JAVA 애플리케이션 자체 인증서 위치 -> $JAVA_HOME/jre/lib/security/cacerts

API 제공업체에서 받은 파일2개와 앞서 만든 서버인증서를 운영체제 내 디렉토리에 넣어두고 진행 

Keytool 활용하여 java 인증저장소에 인증서 import 처리

키이름지정에는 API제공해주는 업체명을 써놓는게 관리 및 확인이 편함

ex) googleCert, googleRoot, googleChain

keytool –importcert –alias 키이름지정 –keystore /$JAVA_HOME/jre/lib/security/cacerts –file /파일경로/ca-bundle.crt

 

keytool –importcert –alias 키이름지정 –keystore /$JAVA_HOME/jre/lib/security/cacerts –file /파일경로/ChainFile_ChainBundle.crt

 

keytool –importcert –alias 키이름지정 –keystore /$JAVA_HOME/jre/lib/security/cacerts –file /파일경로/CA_GLOBALSIGN.crt

 

명령어 수행 시 keytool 비밀번호 : changeit / 이 인증서를 신뢰합니까? y처리

 

인증서가 제대로 저장되었는지 확인

keytool -list -keystore cacerts | grep 키이름

 

이렇게 나오면 유효한 인증서가 저장된것이고 애플리케이션에서 수행 시 오류없이 정상 연동된다.

반응형

'Programming > Linux' 카테고리의 다른 글

FTP 기본 명령어 정리  (0) 2025.04.09
PKIX path building failed 오류 해결  (0) 2022.12.20