개발자의 길

Java 의 keystore에 SSL Server 인증서를 import 하는 방법 본문

4. JAVA

Java 의 keystore에 SSL Server 인증서를 import 하는 방법

자르르 2015. 2. 5. 16:00


증상

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\]

 

원인

SSL로 연결하려는 remote site의 인증서가 신뢰하는 인증기관 인증서 목록(keystore)에 없음

 

 

해결

현재 구동되는 JDK 의 keystore에 상대방 인증서를 넣어줘야 함

  1. google code에서 InstallCert.Java 를 다운로드

     wget https://java-use-examples.googlecode.com/svn/trunk/src/com/aw/ad/util/InstallCert.java

     

  2. vi InstallCert.java 를 한후에 최상단의 package com.aw.ad.util; 를 삭제한다

  3. 컴파일

     javac InstallCert.java

  4. InstallCert 구동

     

     # localhost 에 SSL 인증서를 받아올 호스트명을 입력

    java -cp ./ InstallCert  호스트명.com

     

  5. 다음과 같은 화면이 나오면 1을 눌러서 인증서 저장

     Caused by: java.lang.UnsupportedOperationException
    at InstallCert$SavingTrustManager.getAcceptedIssuers(InstallCert.java:183)
    at sun.security.ssl.AbstractTrustManagerWrapper.checkAlgorithmConstraints(SSLContextImpl.java:926)
    at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(SSLContextImpl.java:872)
    at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:814)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    ... 2 more

     Server sent 1 certificate(s):

     1 Subject CN="lesstif.com,www.lesstif.com", O=lesstif, C=KR
    Issuer CN="lesstif.com,www.lesstif.com", O=lesstif, C=KR
    sha1 03 7b 8f 5c 9b de c2 75 0b 90 b5 b6 9d 18 72 5d 60 ca 58 b7
    md5 0c 9e 9e 2c 0c 72 a8 65 fa 95 f8 d0 72 20 99 bf

     

    Enter certificate to add to trusted keystore or 'q' to quit: [1]

     

  6. 다음과 같은 메시지가 나오고 저장됨. keystore 명과 alias 명을 기억
  7. Added certificate to keystore 'jssecacerts' using alias '호스트명.com'

     

     

  8. keytool 로 keystore에서 인증서 추출 (KeyStore의 암호는 changeit(디폴트 암호) 이라 가정!)

    ## alias 옵션뒤에 위의 alias명 입력 

    keytool -exportcert -keystore jssecacerts -storepass changeit -file

     

  9.  

  10. 현재 JDK 의 keystore에 cert import

     ## JAVA_HOME=/usr/java/jdk1.7.0_25

    keytool -importcert -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit -file output.cert -alias 호스트명.com

  11. 이미 존재할 경우 다음 명령어로 삭제

     keytool -delete  -alias 호스트명.com -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit

  12. 해당 사이트에 다시 연결하여 문제가 해결되었는지 확인

 

 WAS일 경우 JDK 설정이 변경되었으므로 재구동이 필요함

 

◑ JDK나 JRE 가 upgrade 될 경우 위의 작업을 다시 시행해야 함


이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공유하기 링크
Comments