본문 바로가기
JAVA

keytool

by oncerun 2022. 11. 14.
반응형

 

keytool은 Java SDK와 함께 배포되어 bin 디렉터리에 존재하는 보안 관련 프로그램이다. 

 

keytool은 키스토어라는 일종의 데이터베이스를 관리하는 프로그램이다. 이 키 스토어는 두 개의 항목을 가지고 있다.

 

1. key entry

 - 비밀키와 공개키와 관련된 인증서 체인으로 구성

 

2. trusted certificate entry 

 - 신뢰할 수 있는 기관을 나타내는 공개키 인증서

 

키스터의 각 항목은 alias에 의해 식별된다 따라서 키스토어에 새로운 엔티티를 추가할 때 반드시 이 별명은 부여해야 한다.


keytool이 지원하는 커맨드는 다음과 같습니다. 
  • genkey : 공개키/비밀키 쌍을 만듭니다. 지정한 키스토어가 없는 파일이라면 새로 파일을 생성합니다. 
  • certreq : 인증서 서명 요청(CSR, Certificate Signing Request) 파일을 만듭니다. 
  • import : 인증서를 키스토어에 추가합니다. 키스토어가 없는 파일이라면 새로 파일을 만듭니다. 
  • export : 키스토어에서 인증서를 추출하여 파일로 저장합니다. 
  • list : 키스토어 엔트리들을 출력합니다. 

OpenSSL 프로젝트

OpenSSL은 SSL과 TLS 프로토콜과 각종 암호화 라이브러리를 구현한 오픈소스 툴킷입니다. 이 툴킷은 openssl이라는 커맨드 라인 도구를 제공하는데 이를 이용하여 암호화 라이브러리의 다양한 기능을 사용할 수 있습니다.

openssl에서 사용할 수 있는 커맨드는 다음과 같습니다.

  • pkcs12 커맨드 : PKCS#12 파일을 파싱하거나 생성합니다. 
  • req 커맨드 : PKCS#10 포맷의 인증서를 생성하거나 처리합니다. 
OpenSSL은 http://www.openssl.org에서 최신 버전을 다운로드 받을 수 있습니다.

 

KeyStore와 TrustStore

JSSE는 KeyStore와 TrustStore라는 두 개의 파일을 사용합니다. KeyStore는 클라이언트 인증을 위해 클라이언트 측에 놓이는 것이고, TrustStore는 서버를 인증하기 위한 것입니다. 

  • KeyStore는 비밀키, 관련된 인증서 혹은 인증서 체인을 가지고 있는 데이타베이스입니다. 인증서 체인은 클라이언트 인증서와 하나 이상의 CA 인증서(공인인증서)로 구성됩니다. 보통 서버 역할을 하는 측에서만 필요하지만, 클라이언트 인증을 요구하는 경우 클라이언트 쪽도 있어야 합니다. 
  • TrustStore는 클라이언트가 신뢰할 수 있는 인증서만을 가지고 있습니다. 이들 인증서는 CA 루트 인증서 즉 자기서명 인증서입니다. 보통 웹서버가 설치되면 cacerts.jks라는 파일명으로 이 TrustStore가 저장됩니다. 

KeyStore와 TrustStore의 파일 형식은 동일합니다. 이 둘다 keytool을 이용하여 만들고 조작할 수 있습니다.

 

이번 SSL을 적용하면서 KeyStore에 대해 이해하려고 애썼다. 

keystore는 단지 암호화 키와 인증서에 대한 저장소이다.

 

따라서 SSL을 적용하기 위한 요건이 뭔지 먼저 찾아봐야 한다. 

 

첫 번째는 서버의 개인키이다. 해당 개인키가 있어야 공개키로 감싸져온 클라이언트 요청을 처리할 수 있다. 

두 번째는 상위 CA 기관에 인증을 받은 즉, CA 기관의 개인키로 서명이 된 인증서가 필요하다. 

이 인증서에는 서버의 공개키가 들어있고 이를 CA 기관이 서명함으로써 해당 서버의 공개키가 검증된 것이라고 나타내기 때문이다. 

 

세 번째는 여러 상위 기관들의 체인 인증서이다. 하나의 CA에만 인증을 받았다면 별도의 체인 인증서는 필요 없다. 

하지만 대게 와일드 카드 SSL, 여러 기능이 있는 인증서들은 하나 같이 여러 상위 인증서들이 엮여있다. 

 

이러한 파일을 보통 bundle.pem 파일로 묶어서 주기도 하고 별도의 crt 파일로 나누어 주기도 한다. 

 

그렇다면 우리가 할일은 간단하다. 

 

해당 내용을 전부 묶어 keystore에 저장한 후 서버가 시작할 때 해당 keystore에 적용된 인증서를 검증하기만 하면 나머지는 서버가 알아서 해준다. 

 

이 방법에는 여러가지 방법이 존재하는 것 같다.

 

1. pfx파일에 개인키, 인증서, 체인 인증서가 전부 들어있는 경우

 

그냥 pfx파일을 받을 때 받았던 비밀번호와 keystore에 pfx파일을 넣거나 애플리케이션이 시작할 때 읽도록 설정만 해주면 아주 간단하게 끝난다. 

 

2. 기존 개인키와 인증서만 가지고 있었는데 추가적으로 체인 인증서를 받은 경우

 

cat 명령어로 그냥 합쳐서 하나의 pem 파일을 만들고 openssl을 통해 해당 파일을 서버가 인식할 수 있는 p12, jks 파일로 변환한 이후 keytool을 통해 신뢰할 수 있는 저장소를 만들어서 그냥 사용하면 된다. 

 

이 과정을 삽질하다 보면 어느샌가 openssl 옵션과 keytool 옵션, 그리고 웹 서버에 등록해야 하는 설정 옵션을 외워버리는 자신을 만날 수 있다. 

 

나 같은 경우에는 웹 서버에 적용하려다 유지 관리를 위해 별도의 웹서버를 설치하여 사용하지 않고 내장 톰캣에 pfx파일을 적용했다. 

 

정말 주말에 관련 지식을 공부하고 필요한 것들과 필요한 작업만 하니 실제 적용하는 데 걸리는 시간은 1분도 걸리지 않았다. 

 

아 관련 이슈가 있었던 건 받았던 인증서 파일이 와일드카드가 적용된 인증서라고 받았지만 실제 인증서를 확인해보니 와일드 SSL 인증서가 아니었던 거?? 

 

이는 인증서 파일을 보고 대상, 타깃, DNS이름 칸을 보면 * , 별표가 존재해야 한다. 그래야 와일드카드 SSL 인증 서고

와일드카드가 없다면 그냥 단일 도메인에 대한 인증서일 가능성이 크다. 

 

 

 

반응형

'JAVA' 카테고리의 다른 글

Java 11 HttpClient Class  (0) 2022.12.13
S3 다중 업로드를 병렬로 처리 시 발생할 수 있는 문제..(CountDownLatch)  (0) 2022.12.03
가변인수  (0) 2022.11.05
JDK Dynamic Proxy  (0) 2022.01.22
Server Networking Proxy  (0) 2021.11.14

댓글