G2(또는 어떤 신규 루트/체인 인증서)로 교체할 때 TRUSTSTORE를 적용해야 하는 이유와 용도를 쉽게 정리해줄게.
1. TRUSTSTORE 적용하는 이유
✔ 서버 또는 클라이언트가 ‘상대방 인증서를 신뢰하기 위해’
G2 인증서로 교체되면, 기존 Root/Intermediate(체인) 인증서가 G2 계열로 변경됨.
그러면 상대방(서버/클라이언트)에서 **해당 루트/중간 인증서를 신뢰 목록(TRUSTSTORE)**에 넣어야 아래가 가능해짐:
→ “상대방이 제시한 인증서가 정상적이고 신뢰할 수 있는 CA에서 발급되었는지 검증”
즉, “상대방 인증서를 검증할 수 있는 루트/체인 인증서 묶음”을 담아 두는 저장소가 Truststore.
2. TRUSTSTORE의 용도
① SSL/TLS 핸드셰이크 시 인증서 검증
클라이언트나 서버가 상대방 서버와 SSL 연결을 맺을 때 다음을 수행함:
- 상대방 서버가 인증서를 보냄
- 내 시스템은 Truststore 에 있는 Root/Chain(cert)에 기반해 인증서의 유효성을 검증
- 검증이 통과되면 SSL 연결 성립
검증에 필요한 G2 루트/중간 인증서가 Truststore에 없으면 → 인증서 검증 실패 → SSL 연결 불가
오류 예:
| PKIX path building failed unable to find valid certification path to requested target certificate verify failed |
② mTLS(상호 TLS) 환경에서는 더 중요
mTLS 구조에서는
- 서버가 클라이언트 인증서를 검증
- 클라이언트도 서버 인증서를 검증
해야 함.
즉, 양쪽 모두 G2 인증서를 신뢰할 수 있어야 하므로 Truststore 업데이트가 필수.
③ Java 기반 시스템에서 중요한 이유
Java의 통신은 대부분 JSSE(Java Secure Socket Extension)을 통해 이루어지고, 이는 Truststore(기본: cacerts)를 기반으로 인증서 검증 수행.
따라서 WAS(Spring Boot, Tomcat 등)에서 G2 인증서 체인이 없다면 통신 중 다음 에러가 발생할 수 있음.
3. G2 적용 시 Truststore 처리해야 하는 경우/안 해도 되는 경우
- 해야 하는 경우
- 상대방 서버(예: Toss, 카드사, 외부 API)이 G2 체인 인증서로 교체한 경우
- 내가 사용하는 시스템이 Java 기반(Tomcat/Spring/WebClient/RestTemplate 등)
- 내부/외부 HTTPS 통신을 수행하는 프로그램
- mTLS를 사용하는 구조
→ 반드시 Truststore에 G2 root + intermediate 체인을 반영해야 함
- 하지 않아도 되는 경우
- OS 자체가 이미 G2 Root/Chain을 신뢰하고 있고
- 애플리케이션이 OS 인증서 스토어를 직접 사용하는 경우 (일부 Nginx, curl 등)
그러나 Java는 OS 스토어를 자동으로 사용하지 않아서, Java 기반이면 거의 100% Truststore 반영이 필요함.
| 구분 | CERTSTORE | TRUSTSTORE |
| 기능 | 내 서버의 인증서(서버 인증서, 프라이빗 키) 저장 | 신뢰하는 CA 인증서 저장 |
| 필요 이유 | 서버가 "나를 증명" | 상대방 인증서를 "검증" |
| G2 교체 시 | 필요 없음 (개인키 안 바뀌면) | 필요함 (새 CA 체인 필요) |
✔ G2 인증서를 적용 후 통신이 정상적으로 이루어지려면 상대방 인증서를 검증하기 위한 Root/Chain 인증서를 Truststore 에 등록해야 한다.
✔ 특히 Java 기반 시스템 및 mTLS 환경에서는 필수
Java에서 Truststore 업데이트 방법 (keytool)
Java는 기본적으로 아래 경로에 truststore를 가지고 있음:
기본 Truststore 경로
| $JAVA_HOME/lib/security/cacerts |
| changeit |
G2 교체 시 보통 다음 파일을 받음:
- root.crt (Root CA)
- chain.crt 또는 intermediate.crt (중간 CA)
이 두 파일을 truststore에 넣으면 됨.
1-2. 인증서 추가 명령어 (keytool -importcert)
➤ Root CA 추가
| keytool -importcert \ -trustcacerts \ -alias g2-root \ -file root.crt \ -keystore $JAVA_HOME/lib/security/cacerts \ -storepass changeit |
➤ Intermediate(Chain) CA 추가
| keytool -importcert \ -trustcacerts \ -alias g2-chain \ -file chain.crt \ -keystore $JAVA_HOME/lib/security/cacerts \ -storepass changeit |
1-3. 정상 추가 확인하기
|
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit | grep g2
또는: keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
|
1-4. 주의사항
| 항목 | 설명 |
| JDK 버전 여러 개 설치 | 각 JDK의 cacerts에 모두 넣어야 함 |
| WAS(Tomcat) 내장 JDK | 내장 Java의 cacerts 활용 → 해당 경로에 추가해야 함 |
| 서버 재시작 필요 | Java 프로세스 재시작해야 새로운 truststore 반영 |
실무 TIP
가능하면 기본 cacerts를 건드리지 말고 별도의 truststore(jks)를 만들어 사용하는 게 가장 안전함.
예:
| keytool -importcert -alias g2-root -file root.crt -keystore g2-trust.jks -storepass changeit keytool -importcert -alias g2-chain -file chain.crt -keystore g2-trust.jks -storepass changeit |
이렇게 만든 g2-trust.jks 파일을 Spring Boot에 적용하면 운영 서버에서 관리가 더 쉬워짐.
Spring Boot에서 Truststore 적용 예제
Spring Boot에서는 application.yml 또는 application.properties 설정만 추가하면 동작함.
2-1. application.yml 설정 예제
✔ truststore만 사용하는 경우 (단방향 TLS)
| server: ssl: enabled: true trust-store: classpath:g2-trust.jks trust-store-password: changeit trust-store-type: JKS |
✔ mTLS(양방향 인증) 사용하는 경우
mTLS에서는 server 인증서 + truststore 둘 다 필요함.
| server: ssl: enabled: true key-store: classpath:server-keystore.p12 key-store-password: serverpass key-store-type: PKCS12 trust-store: classpath:g2-trust.jks trust-store-password: changeit trust-store-type: JKS client-auth: need # 클라이언트 인증 필요 |
✔ 단방향 TLS
| server.ssl.trust-store=classpath:g2-trust.jks server.ssl.trust-store-password=changeit server.ssl.trust-store-type=JKS |
| server.ssl.key-store=classpath:server-keystore.p12 server.ssl.key-store-password=serverpass server.ssl.key-store-type=PKCS12 server.ssl.trust-store=classpath:g2-trust.jks server.ssl.trust-store-password=changeit server.ssl.trust-store-type=JKS server.ssl.client-auth=need |
2-3. RestTemplate/WebClient outbound 통신도 Truststore 적용해야 하는 경우
Spring Boot가 외부 API로 HTTPS 통신할 때도 Truststore 필요함.
✔ RestTemplate 적용 예제
| @Bean public RestTemplate restTemplate() throws Exception { char[] password = "changeit".toCharArray(); KeyStore trustStore = KeyStore.getInstance("JKS"); trustStore.load(new FileInputStream("g2-trust.jks"), password); SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial(trustStore, null) .build(); HttpClient client = HttpClients.custom() .setSSLContext(sslContext) .build(); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client); return new RestTemplate(factory); } |
✔ WebClient 적용 예제
| @Bean public WebClient webClient() throws Exception { char[] password = "changeit".toCharArray(); KeyStore trustStore = KeyStore.getInstance("JKS"); trustStore.load(new FileInputStream("g2-trust.jks"), password); SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial(trustStore, null) .build(); HttpClient httpClient = HttpClient.create() .secure(sslSpec -> sslSpec.sslContext(sslContext)); return WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .build(); } |
✔ keytool로 Truststore 업데이트
- CA 체인(root + intermediate) 파일 준비
- keytool -importcert로 truststore 에 등록
- Java 프로세스 재시작
✔ Spring Boot 적용
- 단방향 TLS: truststore만 등록
- mTLS: keystore + truststore + client-auth 설정
- 외부 HTTPS 호출 시에도 truststore 필요(RestTemplate/WebClient)
'IT기타 > WEB' 카테고리의 다른 글
| IntelliJ (0) | 2026.02.09 |
|---|---|
| 마케팅 용어 (0) | 2025.12.01 |
| BPF Door 점검 (1) | 2025.11.03 |
| ROAS (0) | 2025.10.22 |
| Stealer logs cloud (0) | 2025.10.16 |