Java 개발을 하다 보면 SSL/TLS 통신에서 인증서 검증 문제가 발생할 수 있습니다. 이때 자바가 사용하는 기본 인증서 저장소가 바로 default JDK truststore입니다. 이 글에서는 truststore가 무엇인지, 기본 truststore의 위치와 역할, 인증서 추가 방법까지 쉽고 자세하게 설명합니다.
📌 Truststore란?
Truststore는 Java에서 신뢰할 수 있는 인증 기관(CA)의 인증서를 저장하는 파일입니다. HTTPS나 기타 보안 통신을 할 때 서버의 인증서가 믿을 수 있는지 판단하기 위해 사용됩니다.
Java는 기본적으로 여러 글로벌 인증기관의 인증서를 포함한 기본 truststore를 제공합니다.
✅ Default JDK Truststore의 위치
Java를 설치하면 자동으로 생성되는 truststore 파일은 보통 아래 경로에 존재합니다:
$JAVA_HOME/lib/security/cacerts
JAVA_HOME은 JDK가 설치된 디렉토리를 의미합니다. 예: /usr/lib/jvm/java-17-openjdk 등
기본 비밀번호는 다음과 같습니다:
changeit
🔍 어떤 인증서가 들어있을까?
cacerts 파일에는 VeriSign, DigiCert, Let's Encrypt 같은 글로벌 CA 인증서들이 들어 있습니다. Java는 이 인증서들과 매칭되는 경우에만 서버의 인증서를 신뢰하고 통신을 허용합니다.
🧪 HTTPS 통신 시 동작 원리
- 클라이언트(Java 애플리케이션)가 HTTPS 요청을 보냅니다.
- 서버는 자신의 SSL 인증서를 제공합니다.
- Java는 해당 인증서의 발급자가 truststore 안에 있는지 확인합니다.
- 인증서가 신뢰되지 않으면 통신은 실패(SSLHandshakeException)합니다.
🔧 사내 인증서나 자체 CA를 추가하는 방법
사내 시스템처럼 Java가 기본적으로 신뢰하지 않는 인증서와 통신하려면, 해당 인증서를 truststore에 수동으로 추가해야 합니다.
▶ keytool 명령어 예시:
keytool -import -trustcacerts -alias mycert \
-file /path/to/mycert.crt \
-keystore $JAVA_HOME/lib/security/cacerts \
-storepass changeit
- mycert.crt: 추가할 인증서 파일
- alias: 인증서 구분을 위한 이름
- storepass: 기본은 changeit (변경 가능)
🧰 커스텀 Truststore를 따로 관리하고 싶다면?
기본 cacerts 파일을 건드리지 않고, 별도 truststore를 만들어서 지정할 수도 있습니다.
-Djavax.net.ssl.trustStore=/path/to/mytruststore.jks \
-Djavax.net.ssl.trustStorePassword=mypassword
이 방법은 민감한 시스템에서 보안을 강화하거나, 다양한 환경에서 인증서를 분리 관리할 때 유용합니다.
📌 요약
항목설명
파일명 | cacerts |
위치 | $JAVA_HOME/lib/security/cacerts |
기본 비밀번호 | changeit |
역할 | SSL 인증서의 유효성 검증 |
인증서 추가 방법 | keytool 명령어 사용 |
🔎 자주 묻는 질문(FAQ)
Q. truststore와 keystore 차이는 뭔가요?
- truststore는 신뢰할 수 있는 외부 인증서(CA)를 저장합니다.
- keystore는 내 서버 또는 앱의 개인 키와 인증서를 저장합니다.
Q. cacerts 수정해도 되나요?
- 가능은 하지만 권장하지 않습니다. 백업 후 수정하거나, 별도 truststore를 사용하는 것이 안전합니다.
📝 마무리
default JDK truststore는 Java 보안 통신의 핵심입니다. 인증서 문제로 통신이 실패했다면, 이 truststore가 원인일 수 있습니다. 기본 구조와 관리 방법만 이해해도 SSL 문제 해결이 훨씬 쉬워질 거예요.
도움이 되셨다면 이 글을 북마크하거나 공유해주세요!