JAVA Root 인증서 교체(w. DNS)
■ Root 인증서란 무엇일까
우리가 흔히 쓰는 HTTPS 웹사이트에는 SSL/TLS 인증서가 존재한다.
이 포스팅하는 Tistory에도 당연히 SSL/TLS 인증서가 적용이 되어있다.
그렇다면 이 SSL/TLS를 신뢰할수 있는지 확인하기 위해 무엇이 필요할까?
브라우저는 인증서를 발급한 중간 CA의 인증서를 호출하고, 중간 CA인증서를 서명한 상위 CA를 찾아 올라가게 된다.
그렇다는건 결국 최상위 CA를 호출하게 될텐데 이것이 Root 인증서다.
Root CA : digicert 라는 회사가 인증서를 만듬
Intermediate 중간 인증서 : thawte tls rsa ca
ssl 인증서 : *.tistory.com
브라우저나 운영체제에는 이미 신뢰할 수 있는 Root인증서들이 사전에 설치되어 있고, 이를 Trust Store 라고 한다.
체인을 따라 올라간 결과가 Trust Store에 있는 인증서와 Root 인증서 간 일치한다면 해당 사이트는 신뢰할 수 있는 사이트 라고 할수 있다.
브라우저에서 인증서를 검증하는 방식은
사용자 → 브라우저 → 서버 인증서 → CA 인증서 → Root CA이다.
이쯤되면 Root 인증서가 DNS 장비의 동작 방식과 구조적으로 매우 유사한 패턴을 보여준다.
PC에서 특정도메인을 호출하면, 각 레코드마다 TTL을 통해 캐시에게 응답하는데,
PC에 저장되어있는 캐쉬를 호출하고, 모르면 상단의 라우터에게 질의를 하고, 회선사업자에게 질의 하고, 결국 전세계에 있는 Root DNS 장비에 호출하게 되는 구조와 유사하다.
Root DNS 서버는 TLD 서버에게 위임하고,
Root CA는 특정 도메인이나 조직에 대한 인증서 발급 권한을 Intermediate(중간) CA에게 위임한다.
쨋던 지금 우리에게 필요한건 Java(JDK/JRE)를 사용하는 기관에서의 Root 인증서 교체 하는법이다.
서버를 호출하는 Client 측에 작업을 진행하면 된다. 사용하는 API의 자바 폴더를 찾자.
[Java]
■ Root 인증서 보유 확인 명령어
keytool -keystore "JAVA Home 경로/jre/lib/security/cacerts" -list -v -storepass changeit |
> cacert에 저장되어 있는 루트 인증서 전체 목록이 표시가 되고,
해당 출력 내용을 확인하여 루트 인증서가 없는경우 아래 명령어를 통해 추가하자
■ Root 인증서 추가
방법 1] keytool -import -keystore "JAVA Home 경로/jre/lib/security/cacerts" -file "루트인증서경로 및 파일명" -alias "루트인증서구분용이름" -storepass changeit |
방법 2] keytool -import -keystore cacerts -file "Global Root GB CA.pem" -alias "globalrootgbca" -storepass changeit |
> 해당 cacerts는 java 환경에서 기본 지정되어 접근되는 경로여야 함.
추가적으로 해당 루트 인증서가 만료되어 교체를 해야하는 상황이면, 신규 cacerts 파일을 교체하면 되는데,
cacerts 파일 내에는 Root인증서가 추가 되어있는 경우가 많다. ssl 인증서 교체하듯이 파일 바꿔주면 된다.