Child pages
  • Java 에서 ValidatorException 등 인증서 관련 에러 해결 - keystore에 SSL/TLS 인증서를 import 하기

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. gist 에서 InstallCert.Java 를 다운로드

    Code Block
    curl -O https://gist.githubusercontent.com/lesstif/cd26f57b7cfd2cd55241b20e05b5cd93/raw/InstallCert.java
    Expand

    Gist
    urlhttps://gist.github.com/lesstif/cd26f57b7cfd2cd55241b20e05b5cd93

  2. 컴파일

    Code Block
    javac InstallCert.java
  3. InstallCert 구동

    Code Block
    languagebash
    # localhost 에 SSL 인증서를 받아올 호스트명을 입력
    java -cp ./ InstallCert  lesstif.com
  4. 다음과 같은 화면이 나오면 1을 눌러서 인증서 저장

    Panel
    borderColorblue
    borderStylesolid
    titlessl import

    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 2 certificate(s):

    1 Subject CN=wiki.modernpug.org
    Issuer CN=Let's Encrypt Authority X3, O=Let's Encrypt, C=US
    sha1 47 0a 15 c4 5d ed 62 0a 4b 18 d5 d8 58 14 42 5d 36 e0 d5 8f
    md5 3a 0d ab ce 27 be dd bd e5 c1 d5 e8 b6 25 aa eb

    2 Subject CN=Let's Encrypt Authority X3, O=Let's Encrypt, C=US
    Issuer CN=DST Root CA X3, O=Digital Signature Trust Co.
    sha1 e6 a3 b4 5b 06 2d 50 9b 33 82 28 2d 19 6e fe 97 d5 95 6c cb
    md5 b1 54 09 27 4f 54 ad 8f 02 3d 3b 85 a5 ec ec 5d

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

    서버가 2 개의 인증서를 전송했는데 2번째가 Let's Encrypt 의 CA 인증서이므로 2번을 선택해서 저장해야 한다.

  5. 다음과 같은 메시지가 나오고 저장됨. keystore 명과 alias 명을 기억

    Panel

    Added certificate to keystore 'jssecacerts' using alias 'letsencrypt'

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

    Code Block
    languagebash
    ## alias 옵션뒤에 위의 alias명 입력
    keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert -alias letsencrypt
    Note

    -alias 옵션 뒤에 파라미터는 5번에서 저장된 alias(letsencrypt) 를 입력

  7. 현재 JDK 의 keystore에 cert import

    Code Block
    languagebash
    ## JAVA_HOME=/usr/java/jdk1.7.0_25
    keytool -importcert -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit -file output.cert -alias letsencrypt

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

    Note
    keytool -delete  -alias letsencrypt -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit

...