사설 Root CA 인증서를 JVM truststore에 등록하기
TOC
Overview
사설 인증서를 발급받은 서버에 Java 애플리케이션에서 HTTPS 요청을 보내려면 JVM이 해당 서버 인증서의 발급 경로를 신뢰할 수 있어야 한다.
이 글에서는 사설 Root CA 인증서를 PKCS12 형식의 JVM truststore에 등록하고, Java 애플리케이션 실행 시 해당 truststore를 사용하도록 설정하는 방법을 다룬다.
사설 Root CA 인증서 준비
서버 인증서의 발급 경로에 포함된 사설 Root CA 인증서를 준비한다.
private-root-ca.crt
JVM에 등록하는 대상은 서버 인증서가 아니라, 서버 인증서의 발급 경로를 신뢰하기 위한 사설 Root CA 인증서다.
.crt 파일을 .p12 파일로 단순히 변환하는 것은 아니다. .crt는 보통 X.509 인증서 파일이고, .p12는 인증서와 키 등을 저장할 수 있는 PKCS12 형식의 컨테이너다.
private-root-ca.crt
↓ import
private-ca-truststore.p12
PKCS12 truststore 생성
keytool을 사용해 사설 Root CA 인증서를 PKCS12 truststore에 import한다.
keytool -importcert \
-alias private-root-ca \
-file private-root-ca.crt \
-keystore private-ca-truststore.p12 \
-storetype PKCS12
각 옵션의 의미는 다음과 같다.
-alias: truststore 안에서 인증서를 식별하는 이름-file: import할 사설 Root CA 인증서-keystore: 생성하거나 수정할 truststore 파일-storetype PKCS12: truststore 형식
JVM이 사설 Root CA를 신뢰 기준으로 사용할 수 있도록, 인증서를 JVM이 읽을 수 있는 truststore에 저장하는 과정이다.
하나의 PKCS12 truststore에는 여러 CA 인증서를 alias별로 저장할 수 있다.
private-ca-truststore.p12
├─ private-root-ca
├─ partner-root-ca
└─ another-root-ca
JVM에 truststore 지정
Java 애플리케이션을 실행할 때 사용할 truststore의 경로와 비밀번호를 JVM 옵션으로 지정한다.
java \
-Djavax.net.ssl.trustStore=/path/private-ca-truststore.p12 \
-Djavax.net.ssl.trustStorePassword="$TRUSTSTORE_PASSWORD" \
-Djavax.net.ssl.trustStoreType=PKCS12 \
-jar application.jar
truststore를 생성하는 것만으로 JVM이 해당 파일을 자동으로 사용하는 것은 아니므로, 애플리케이션이 사용할 truststore를 실행 시 지정해야 한다.
HTTPS 연결 확인
truststore를 지정한 상태로 Java 애플리케이션을 실행하고 사설 HTTPS 서버에 요청을 보낸다.
Java 애플리케이션 실행
↓
JVM이 PKCS12 truststore 로드
↓
사설 Root CA를 신뢰 기준으로 사용
↓
서버 인증서 경로 검증
↓
HTTPS 연결
truststore 등록과 JVM 설정이 실제 HTTPS 인증서 검증에 적용되었는지 확인한다.
문제 발생 시 점검 순서
| 오류 | 우선 확인할 내용 |
|---|---|
PKIX path building failed |
사설 Root CA가 truststore에 등록됐는가 |
| truststore를 찾지 못함 | 경로와 파일 권한 |
| 비밀번호 오류 | truststore 비밀번호 |
| hostname 오류 | 요청 도메인과 인증서의 SAN |
| 설정 후에도 실패함 | 별도 SSLContext 또는 HTTP client 사용 여부 |
정리
사설 Root CA 인증서를 PKCS12 truststore에 import하고 JVM에 지정하면 Java 애플리케이션이 사설 CA에서 발급한 서버 인증서를 검증할 수 있다.
사설 Root CA 인증서
↓ import
PKCS12 truststore
↓ JVM에 지정
Java 애플리케이션
↓
사설 HTTPS 서버 호출
.crt 인증서를 .p12로 단순 변환하는 것이 아니라, 인증서를 PKCS12 truststore 컨테이너에 import하는 것이다. 하나의 truststore에 여러 CA 인증서를 저장할 수도 있다.