InstallCert를 사용하여 SSL/TLS Server 인증서 생성하기
Ubuntu 환경에서 Java InstallCert를 사용하여 SSL/TLS Server 인증서를 생성하는 방법에 대해 알아보겠습니다.
Java를 사용하여 HTTPS로 remote 사이트에 연결시 다음과 같은 Exception이 발생합니다.
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\]
또한 인증서 없이 HttpsURLConnection을 사용하면 다음과 같이 SSLHandshakeException도 발생하게 됩니다.
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
이러한 문제는 연결하려는 remote 사이트의 인증서가 신뢰하는 인증기관 인증서 목록(keystore)에 없기 때문에 발생합니다.
해결하기 위해서는 현재 설치된 JDK의 keystore에 인증서를 생성하여 저장해줘야 합니다.
1. InstallCert.java 다운로드
인증서를 생성하기 위하여 아래의 InstallCert.java 파일을 다운로드 받습니다.
2. 인증서 생성하기
다운로드 받은 파일을 Ubuntu 환경으로 옮겨주고 ${JAVA_HOME}/jre/lib/security 하위 경로로 옮겨줍니다.
$ sudo mv [경로]/InstallCert.java ${JAVA_HOME}/jre/lib/security/
※ JAVA_HOME이 설정되어 있지 않은 경우 /usr/lib/jvm 하위 경로에서 jdk 디렉터리를 찾아 설정하고 옮겨주시면 됩니다.
ex) JAVA_HOME=/usr/lib/jvm/jdk1.7.0_80
다음으로 InstallCert.java 파일을 컴파일 해줍니다.
$ sudo javac -d . InstallCert.java
컴파일이 되었으면 InstallCert.class 파일을 실행해줍니다.
$ sudo java -cp . InstallCert [IP/HOST]
실행하면 keystore에 추가할 것인지 물어보는데 '1'을 입력하고 엔터를 누릅니다.
위와 같이 alias와 함께 결과가 출력되면 인증서가 정상적으로 생성된 것입니다.
파일 목록을 확인해보면 jssecacerts 파일이 생성된 것을 확인할 수 있습니다.
생성된 jssecacerts 파일을 HTTPS 사이트의 인증서로 사용하여 연결 작업을 진행할 수 있습니다.
또한, keytool 명령어를 사용하여 keystore에 등록된 인증서를 확인할 수 있습니다. (기본으로 설정된 패스워드는 changeit 입니다.)
$ keytool -list -keystore jssecacerts
생성된 인증서를 삭제하려면 다음과 같이 실행해주면 됩니다.
인증서 생성시 alias 값이 출력되는데 이 값을 사용하여 삭제해주면 됩니다.
$ keytool -delete -keystore jssecacerts -alias [인증서_alias]
※ 외부 인증서 import 하기
마지막으로 jssecacerts 파일이 외부에 있을 경우 import 하여 사용하는 방법에 대해 알아보겠습니다.
(인증서 경로는 jssecacerts 파일이 위치한 경로로 설정해주시면 됩니다.)
첫번째는 다음과 같이 System.setProperty() 메서드를 사용하는 방법입니다.
System.setProperty("javax.net.ssl.trustStore", "[인증서_경로]");
두번째는 JVM 옵션에 추가해주는 방법입니다.
-Djavax.net.ssl.trustStore=[인증서_경로]
이상으로 Ubuntu 환경에서 InstallCert를 사용하여 인증서를 생성하는 방법에 대해 알아보았습니다.
※ 참고 문헌
tistory, java installcert, http://blog.geun.kr/79
- naver blog, java installcert, https://m.blog.naver.com/PostView.nhn?blogId=kgj1&logNo=220584997842&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F
- tistory, java installcert, http://piterjige.tistory.com/15
- lesstif.com, java installcert, https://www.lesstif.com/pages/viewpage.action?pageId=12451848