회사에서 매일 공공기관에서 제공하는 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 |