'SSL'에 해당되는 글 4건

  1. 2020.11.06 Java cacerts 인증서 추가(keytool 이용)
Java2020. 11. 6. 13:37

 

 

인증서 파일을 이용해 TLS를 적용하다보면,  클라이언트 단에서 문제가 생길 경우가 많이 발생한다.
SSLHandshakeException 이라거나, PKIX Exception 이라거나.
문제가 생기는 경우는 여러가지 있을수 있는데, 대표적으로
1. 처음부터 신뢰할 수 있는 기관에서 발급받은 아니거나
2. 대중적으로 신뢰할 수 있는 기관이지만 Java에서 신뢰를 하지 못한다.
3. TLS 적용버전이 서로 다른 경우

 


등등이 있다.

 


해결 방법은 여러가지가 있는데 나같은 경우는 PKIX Exception이 발생했고,
일단 여러가지 해결방안은
1. $JAVA_HOME/jre/lib/security/ 경로 내에 존재하는 cacerts 에 인증기관의 루트CA를 추가해준다.
2. 루트CA를 jks같이 인식가능한 포멧으로 변환하고  TrustManager[]를 만든다.
3. 빈 TrustManager[] 를 만들어 모든 인증서를 신뢰해버리게 만든다.

 


처음엔 3번을 시도하였으나, 제대로된 방법이 아니다라는 판단이 들어 1번으로 해결하기로 했다.
1번 방안에 대한 해결법을 알아보자.

 


브라우저마다 신뢰할수 있는 인증서를 가지고 있는것처럼, Java도 신뢰할 수 있는 인증서 관리를 하고있다. 
JDK 경로의 cacerts에 인증 기관의 root CA를 등록해줌으로써, 클라이언트 단에서의 HTTPS 요청 불가 문제를 해결하였다. 
(다른 방법도 있다. 애초에 서버의 인증서를 비용을 지불하던지 해서 최상위 루트기관으로부터 신뢰할 수 있는 인증서로 발급받으면 되긴한다.)

 


우리가 이용해야할 경로는 2가지이다.

 

 

"$JAVA_HOME/jre/lib/security/cacerts"
"$JAVA_HOME/bin/"

 

 

cacerts 파일은 인증서 리스트를 관리하고 있고, bin에서는 keytool이 있기 때문.
우선 $JAVA_HOME/bin/ 경로로 이동하자.

 

 

 

keytool.exe, java.exe, javac.exe 등 ... 자바 관련한 많은 실행파일들이 보이는것을 확인할 수 있다. 이 폴더 창을 cmd를 이용하여 연다. Shift + 우클릭시 '여기서 명령 창 열기' 메뉴가 나오니 클릭하면 된다.

 


cmd 창에 다음과 같이 입력한다.

 

keytool -import -file "root 인증서 파일 경로"
-keystore "C:\Program Files\java\jdk1.8.0_65\jre\lib\security\cacerts" 
-storepass "changeit"

 

 

storepass는 기본적으로 설정을 따로 하지 않았다면 "changeit"이다. 
keystore는 $JAVA_HOME\jre\lib\security\cacerts 를 입력해주면 된다. 해당 파일에서 리스트를 관리하고 있다.

나의 경우는 다음과 같이 입력하였다.

 

 

 

 

파일 경로와 명령어를 올바르게 입력하몄다면, 창에 인증서 내용들이 출력되며 다음과 같은 메시지가 나온다.

 

 

 

 

 

'y'를 타이핑 하고 엔터를 친다.

'인증서가 키 저장소에 추가되었습니다.'라는 메시지와 함께 이제 클라이언트는 해당 인증서를 신뢰하고 서버에 요청을 할 수 있다. 본인의 경우 OCSP 요청이 안되는 문제였고, 해당 과정을 진행하고 나서(윈도우7) OCSP request 응답을 성공적으로 받아올 수 있었다.

 

 

 

'Java' 카테고리의 다른 글

Map을 Json으로 - Gson  (0) 2020.11.07
java byte order 변경 메소드  (0) 2020.11.07
Eclipse Code template 적용하기  (0) 2020.11.07
JAVA 싱글턴 패턴  (0) 2020.11.04
JDK 환경변수 설정  (0) 2020.11.04
Posted by 사슴영혼'-'