본문 바로가기

IT기타/WEB

G2 인증서

G2(또는 어떤 신규 루트/체인 인증서)로 교체할 때 TRUSTSTORE를 적용해야 하는 이유와 용도를 쉽게 정리해줄게.

1. TRUSTSTORE 적용하는 이유

서버 또는 클라이언트가 ‘상대방 인증서를 신뢰하기 위해’

 

G2 인증서로 교체되면, 기존 Root/Intermediate(체인) 인증서가 G2 계열로 변경됨.
그러면 상대방(서버/클라이언트)에서 **해당 루트/중간 인증서를 신뢰 목록(TRUSTSTORE)**에 넣어야 아래가 가능해짐:

→ “상대방이 제시한 인증서가 정상적이고 신뢰할 수 있는 CA에서 발급되었는지 검증”

즉, “상대방 인증서를 검증할 수 있는 루트/체인 인증서 묶음”을 담아 두는 저장소가 Truststore.

2. TRUSTSTORE의 용도

① SSL/TLS 핸드셰이크 시 인증서 검증

클라이언트나 서버가 상대방 서버와 SSL 연결을 맺을 때 다음을 수행함:

  1. 상대방 서버가 인증서를 보냄
  2. 내 시스템은 Truststore 에 있는 Root/Chain(cert)에 기반해 인증서의 유효성을 검증
  3. 검증이 통과되면 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
1-1. 인증서 파일 준비

 

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  # 클라이언트 인증 필요
 2-2. application.properties 버전

✔ 단방향 TLS

server.ssl.trust-store=classpath:g2-trust.jks 
server.ssl.trust-store-password=changeit 
server.ssl.trust-store-type=JKS
✔ mTLS
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 업데이트

  1. CA 체인(root + intermediate) 파일 준비
  2. keytool -importcert로 truststore 에 등록
  3. 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