본문 바로가기

인프라/MW

(Keystore)Self-Signed-Cert-Trust-Manager(InstallCert.java)

InstallCert.java를 이용한 Self-Signed-Cert를 생성하는 방법에 대해서 간략하게 소개를 하도록하겠다.

 

해당 클래스는 오라클에서 제공하는 클래스중 (JAVA)JSSE X509TrustManager를 이용하여, SSL인증서를 생성하도록 Andreas Sterbenz's가 올린 클래스이다.

 

이 클래스는 특정 오류 또는 WAS에서 서비스 연동을 위해 SSL 인증서를 생성 및 keystore에 등록할 때, 사용하면 된다.

 

해당 방법 외에도 직접적으로 openssl 명령어를 이용한 SSL 인증서 생성도 가능하나 해당 클래스를 이용하는 방식이 보다 간편하기에 사용하는 것을 추천하는바이며, 스크립트를 통하여 생성하는 방식은 해당 내용에서는 제외하겠다.

(스크립트는 APACHE Compile 설치방법(WEB/SSL Self-Signed-Cert Generate)를 참조)

 

해당 클래스에 대한 상세한 내용은 InstallCert.java를 참고하면 되겠다.

 


오류 및 발생원인

...더보기

1. 오류내용/발생원인

- JAVA 클래스에서 HTTPS로 목적지로 연결시도 시, SSL 통신 과정에서 Exception이 발생.

- 예시) WAS 서버에서 FCM 또는 GCM 연동 시도 시, keystore 내 google 인증서가 등재되어있지 않을 시에 발생.

- FCM/GCM(서비스종료) : 구글에서 제공해주는 PUSH서비스 

Caused by: javax.naming.CommunicationException: simple bind failed: <server-name> 
[Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target\]

2. 상세원인

- 1. 연결하고자하는 DNS(목적지)의 인증서가 인증서 목록(keystore)에 없을 경우.
- 2. 출발지/목적지 서버 간 사용되는 SSL/TLS버전이 비일치 할 경우.

     예시) 출발지(TLS1.0)<-> 목적지(TLS1.2) hand shaking
- 3. SSL/TLS 통신에 사용되는 알고리즘이 오래되거나 지원되지 않는 경우.

     예시) jdk8(8u51)이상 RC4 알고리즘을 사용중단(SunJSSE 제공자의 RC4 사용 중단)


Self-Signed-Cert 설치방법(SSL Certification/Install)

...더보기

1. SSL Certification Install(JAVA Keytools)(사전준비)

 

jdk다운로드/설치는 JDK 설치방법(JDK/Install)를 참고하자.

 

컴파일에 필요한 의존성 라이브러리 설치

sudo yum -y install openssl-devel

 

export ID=`whoami`
export BASE_DIR=`cat /etc/passwd|grep ${ID}|cut -f6 -d ':'`

 

인증서 생성 작업진행(디렉터리생성&다운로드&컴파일&실행)

#- 디렉터리생성
mkdir ${BASE_DIR}/cert
cd ${BASE_DIR}/cert

#- 다운로드
wget https://javaee.github.io/javamail/InstallCert.java

#- 컴파일
${JAVA_HOME}/bin/javac "${BASE_DIR}/cert/InstallCert.java"

#- 인증서생성(실행ex): domain:port)
${JAVA_HOME}/bin/java -cp . InstallCert google.com:443

 

#- 하단 에러발생무시(java버전미지원)

 

2. 인증서 생성 추출 하여, JAVA Keytool 내, 등록

#- 클래스로 생성한 인증서/Alais를 통한 추출(export)
${JAVA_HOME}/bin/keytool -exportcert -keystore ${BASE_DIR}/cert/jssecacerts -storepass changeit -file ${BASE_DIR}/cert/self-signed.crt -alias "google.com-1"

#- Alias로 추출한 인증서 JAVA Keystore에 등록(import)
${JAVA_HOME}/bin/keytool -importcert -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit -file ${BASE_DIR}/cert/self-signed.crt -alias "google"

 

클래스로 생성한 인증서(CaCert)내, Alias를 통한 추출 및 JAVA CaCert에 추출한 인증서 삽입

  

#- 등록한 인증서확인(간소화)
${JAVA_HOME}/bin/keytool -list -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit -alias 'google'

#- 등록한 인증서확인(디테일)
${JAVA_HOME}/bin/keytool -list -v -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit -alias 'google'

 

JAVA Keytool 내, 인증서 설치 대상 Alias 검색 확인(간소화/디테일)

 

#- References

(Install/Debug)certification

(Free)RootCACertification

(Guide)JAVA_Keytools

(Info)InstallCert.java

(Sample)InstallCert.java

(SSL-Cert)Google Cloud Setting

(OpenSSL)Command Manual

(JAVA)JSSE Info

(release_note)jdk1.8

'인프라 > MW' 카테고리의 다른 글

[GitLab] ID/PASSWORD STORE AFTER EASY GIT CLONE(SSH Key include Client between Server)  (0) 2019.12.26
[GitLab/Linux or Unix] password reset (Root/Admin)  (0) 2019.12.20
SVN(Subversion)  (0) 2019.09.26
Nginx  (0) 2019.09.26
Apache  (0) 2019.09.26