자체 서명 된 인증서를 기본적으로 모든 Java 응용 프로그램에서 사용할 수있는 Java 키 저장소로 올바르게 가져 오는 방법은 무엇입니까?


144

자체 서명 된 인증서를 Java로 가져 와서 SSL 연결을 설정하려는 Java 응용 프로그램이이 인증서를 신뢰하도록하고 싶습니다.

지금까지 가져 왔습니다

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem

아직도, 내가 달리려고 할 때 나는 HTTPSClient.class여전히 얻는다 :

javax.net.ssl.SSLHandshakeException : sun.security.validator.ValidatorException : PKIX 경로 작성 실패 : sun.security.provider.certpath.SunCertPathBuilderException : 요청 된 대상에 대한 유효한 인증 경로를 찾을 수 없습니다.

나는 그 코드에 반드시 의존하지는 않을 것이다. Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())첫 번째 부분에서는 이와 같은 것이 완전히 필요하지 않습니다. 두 번째는 인증서 확인을 수행하지 않습니다. 평야 URLConnection부터 시작해보십시오 . JRE 설치 cacerts에서 수정 lib/security했습니까? trustmanager디버깅 옵션 을 사용해 보셨습니까 ?
Bruno

답변:


225

Windows 에서 가장 쉬운 방법은 프로그램 portecle 을 사용하는 입니다.

  1. portecle을 다운로드하여 설치하십시오.
  2. 먼저 프로그램을 실행하는 데 사용되는 JRE 또는 JDK를 100 % 확인하십시오. 64 비트 Windows 7에는 꽤 많은 JRE가있을 수 있습니다. 프로세스 탐색기가이를 도와 주거나 다음을 사용할 수 있습니다.System.out.println(System.getProperty("java.home"));
  3. JAVA_HOME \ lib \ security \ cacerts 파일을 다른 폴더로 복사하십시오.
  4. Portecle에서 파일> 키 저장소 파일 열기를 클릭하십시오.
  5. cacerts 파일을 선택하십시오
  6. 이 비밀번호를 입력하십시오 : changeit
  7. 도구> 신뢰할 수있는 인증서 가져 오기를 클릭하십시오.
  8. mycertificate.pem 파일을 찾습니다.
  9. 가져 오기를 클릭하십시오
  10. 신뢰 경로에 대한 경고를 보려면 확인을 클릭하십시오.
  11. 인증서에 대한 세부 사항이 표시되면 확인을 클릭하십시오.
  12. 인증서를 신뢰할 수있는 것으로 승인하려면 예를 클릭하십시오.
  13. 별명을 요청하면 확인을 클릭하고 인증서를 가져 왔음을 알리면 확인을 다시 클릭하십시오.
  14. 저장을 클릭하십시오. 이것을 잊지 마십시오. 그렇지 않으면 변경 사항이 취소됩니다.
  15. 파일 cacerts를 찾은 위치로 다시 복사하십시오.

Linux에서 :

다음과 같이 이미 사용중인 웹 서버에서 SSL 인증서를 다운로드 할 수 있습니다.

$ echo -n | openssl s_client -connect www.example.com:443 | \
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt

선택적으로 인증서 정보를 확인하십시오.

$ openssl x509 -in /tmp/examplecert.crt -text

인증서를 Java cacerts 키 저장소로 가져 오십시오.

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt

1
이것의 주요 아이디어는 portecle이 아니라 올바른 키 저장소로 인증서를 가져 오는 것입니다.
Alfabravo

이것은 효과가 있었지만 Java는 다른 위치에있었습니다. 내 키 저장소는 / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts에 있었으며, 실행 ps -ef | grep java하여 찾은 Java는 / usr / lib / jvm / java-openjdk /에있는 openjdk에서 실행되고 있음 을 알려줍니다. bin / java. 또한 웹 응용 프로그램의 경우 다시 시작해야합니다. 도와 주셔서 감사합니다!!
Codezilla

7
나는 portecle을 사용하지 않았지만 Keystore Explorer 는 Windows, Linux에서 잘 작동하고 OSX에서도 작동해야 함을 발견했습니다.
Xantix

정말 도움이되었습니다. 여기에 강조된 2 가지 중요한 사항이 있습니다. 하나는 올바른 키 저장소로 가져 오기에 관한 것입니다. 또 다른 하나는 웹 서버의 경우 다시 시작해야합니다.
sdm

6
2019 년에는 Lets encrypt
Ferrybig

41
    D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"

12
키 저장소 비밀번호를 입력하라는 메시지가 표시되며 기본값은 "changeit"입니다.
Gilbert Arenas Dagger

34

인증서를 키 저장소에 추가하는 작은 스크립트를 작성하여 사용하기가 훨씬 쉬워졌습니다.

https://github.com/ssbarnea/keytool-trust 에서 최신 버전을 얻을 수 있습니다.

#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}

KEYSTORE_PASS=changeit
KEYTOOL="sudo keytool"

# /etc/java-6-sun/security/cacerts

for CACERTS in  /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
    /usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts"
do

if [ -e "$CACERTS" ]
then
    echo --- Adding certs to $CACERTS

# FYI: the default keystore is located in ~/.keystore

if [ -z "$REMHOST" ]
    then
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
    exit 1
    fi

set -e

rm -f $REMHOST:$REMPORT.pem

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
        then
        :
        else
        cat /tmp/keytool_stdout
        cat /tmp/output
        exit 1
        fi

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
        then
        :
        else
        echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
        cat /tmp/output
        fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
    then
    echo "Key of $REMHOST already found, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
    then
    echo "Key of $REMHOST already found in cacerts, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

fi

done

```


18

이것은 나를 위해 일했습니다. :)

sudo keytool -importcert -file 파일 이름 .cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 

4

기본적으로 Java cacerts 파일에 포함되지 않은 인증 기관에서 서명 한 인증서를 사용하는 경우 HTTPS 연결을 위해 다음 구성을 완료해야합니다. 인증서를 cacerts로 가져 오려면

  1. Windows 탐색기를 열고 cacerts 파일을 탐색하십시오.이 파일은 AX Core Client가 설치된 jre \ lib \ security 하위 폴더에 있습니다. 기본 위치는 C : \ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security입니다.
  2. 변경하기 전에 파일의 백업 사본을 작성하십시오.
  3. 사용중인 인증 기관에서받은 인증서에 따라 중간 인증서 및 / 또는 루트 인증서를 cacerts 파일로 가져와야 할 수 있습니다. 다음 구문을 사용하여 인증서를 가져 오십시오. keytool -import -alias -keystore -trustcacerts -file
  4. 두 인증서를 모두 가져 오는 경우 각 인증서에 지정된 별명이 고유해야합니다.
  5. “Password”프롬프트에서 키 저장소의 비밀번호를 입력하고 Enter를 누르십시오. cacerts 파일의 기본 Java 비밀번호는“changeit”입니다. "이 인증서를 신뢰 하시겠습니까?"에 'y'를 입력하십시오. 프롬프트하고 Enter를 누르십시오.

이 명령을 사용 : -> 키 도구 -import -alias <별칭> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
바랏 Darakh

1

간단한 명령 'keytool'은 Windows 및 / 또는 Cygwin에서도 작동합니다.

Cygwin을 사용하는 경우 여기에 "S.Botha 's"답변의 맨 아래에서 사용한 수정 된 명령이 있습니다.

  1. 사용할 JDK 내부의 JRE를 식별해야합니다.
  2. 관리자로 프롬프트 / cygwin을 시작하십시오
  3. 해당 JDK의 bin 디렉토리로 이동하십시오 (예 : cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin).
  4. 내부에서 keytool 명령을 실행하십시오. 여기에서 다음과 같이 끝에 새 Cert의 경로를 제공하십시오.

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts  -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"

Cygwin 아래에 있으면 Cygwin이 아닌 프로그램에 대한 경로를 제공하므로 경로는 DOS와 유사하며 따옴표로 표시됩니다.


0

시도하고 싶을 수도 있습니다

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

난 그냥 당신이 그냥 cacerts전체 경로를 제공 작성하면 인증서를 넣을 곳을 솔직히 모른다


0

자바 리눅스에 인증서를 설치

/ opt / jdk (버전) / bin / keytool -import-별칭 별명 -file certificate.cer -keystore cacerts -storepass password


0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.