본문 바로가기
개발

왜 브라우저는 HTTPS가 되는데 Java 서버는 실패할까?

by 새싹 아빠 2025. 9. 16.

 

브라우저는 운영체제(OS) 인증서 저장소를 사용하고, Java 서버는 자체 cacerts 저장소를 사용하기 때문에 이런 차이가 생깁니다.

1. 문제 상황

브라우저에서는 홍수통제소 Open API 같은 HTTPS 사이트가 잘 열리지만, Java 서버(Spring Boot 배치 등)에서는 PKIX path building failed 오류가 발생할 수 있습니다.

2. HTTPS 신뢰 구조

  • 서버는 SSL 인증서와 중간 인증서를 제시합니다.
  • 클라이언트는 루트 CA까지 체인을 검증해야 합니다.
  • 운영체제/브라우저/JDK는 “모든 인증서”를 저장하는 게 아니라, 루트 CA 몇십~몇백 개만 저장합니다.

3. 브라우저 vs Java

환경 참고하는 저장소 특징
브라우저(Vue 포함) 운영체제 저장소 OS 업데이트로 최신 CA 자동 반영
Flutter 앱 안드로이드/iOS 저장소 모바일 OS 인증서 사용
Java 서버 cacerts JDK 배포판 포함 CA만 사용 → 부족할 수 있음

4. 왜 문제가 생겼나?

홍수통제소가 사용하는 루트 CA가 Java cacerts에 없었기 때문입니다. 브라우저는 OS 저장소를 쓰므로 괜찮지만, Java는 직접 추가해야 합니다.

5. 해결 방법

# 서버 인증서 체인 확인
openssl s_client -connect api.example.go.kr:443 -showcerts

# 필요한 CA 인증서를 저장 후 Java에 import
keytool -importcert -file RootCA.crt -alias rootca \
 -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit

운영 환경에서는 별도의 truststore를 만들어 JVM 옵션에 지정하는 것이 더 안전합니다:

java -Djavax.net.ssl.trustStore=/path/to/truststore.jks \
     -Djavax.net.ssl.trustStorePassword=비밀번호 \
     -jar app.jar

6. FAQ

Q. JDK는 Oracle 것만 있나요?
아닙니다. OpenJDK, Temurin, Corretto, Zulu 등 다양한 배포판이 있습니다.

Q. 루트 CA가 수억 개인가요?
아닙니다. 보통 수십~수백 개 정도입니다.

Q. Vue/Flutter도 CA를 따로 넣어야 하나요?
보통 필요 없습니다. OS/브라우저가 관리합니다.