JVM에 SSL 루트 인증서 추가 방법

기본적으로 SSL(TLS) 인증서가 적용된 서버와 통신하려면 클라이언트 단에서 서버에 적용된 인증서를 신뢰할 수 있어야 한다. 이를 위해 클라이언트에 해당 인증서의 루트 인증서가 설치되어 있어야 한다.

JVM에선 cacerts 라는 파일에 신뢰할 수 있는 인증서를 저장한다.

JVM SSL 루트 인증서 추가 방법

루트 인증서를 준비한다. 이건 서버에 SSL 인증서 등록한 쪽에서 추출해 줘야된다. 보통 crt, cer 확장자다.

cacerts에 해당 루트 인증서를 등록한다.

keytool -import -alias [등록할 별칭] -keystore JAVA_HOME\jre\lib\security\cacerts -file [루트인증서 경로]

예시)

keytool -import -alias Digicertroot -keystore cacerts -file DigiCertRoot.cer

비밀번호 입력창이 나오면 디폴트 비밀번호인 changeit 을 입력하면 된다.

인증서 등록이 완료되면 JVM으로 구동한 애플리케이션을 재기동해야 반영이 완료된다.

클라이언트에도 인증서를 꼭 추가해야 하나?

클라이언트에 굳이 인증서를 추가하지 않더라도 서버와 SSL 통신에 문제가 없을 수도 있는데 이런 경우에도 인증서가 필요 없는 게 아니라 이미 있어서 통신이 되는 거다. 필요없다고 오해하면 안 된다.

예를 들어 웹 브라우저에서 사이트 접속하면 다 HTTPS로 접속하는데 컴퓨터엔 따로 인증서를 설치한 적이 없다. 그 이유는 이미 웹 브라우저나 운영체제가 사전에 신뢰할 수 있는 인증기관(CA)의 루트 인증서를 내장하고 있기 때문이다.

실무에선 자체 서명한 인증서도 종종 쓰기 때문에 이런 경우 클라이언트에 해당 루트 인증서를 직접 추가해줘야 SSL 통신이 가능하다.

keytool -list -keystore JAVA_HOME\jre\lib\security\cacerts

이렇게 JVM에 내장된 루트 인증서 목록을 보면

jvm keystore 목록

키 저장소에 이미 145개의 항목이 포함되어 있는 걸 볼 수 있는데 이게 기본적으로 추가된 신뢰할 수 있는 인증서 목록이다. 여기에 해당하는 기관에서 발행한 인증서를 사용한 서버와는 바로 SSL 통신을 할 수 있다.

SSL 인증서는 HTTPS 프로토콜에 가장 많이 사용되는 것 같긴한데 LDAPS 같은 프로토콜도 암호화 통신을 하는 원리 자체는 같기 때문에 똑같이 적용 해주면 된다.

관련 글

댓글 남기기