Programing

기본적으로 모든 Java 애플리케이션이 사용할 수 있는 Java Keystore로 자체 서명된 인증서를 가져오는 방법

c10106 2022. 5. 6. 19:37
반응형

기본적으로 모든 Java 애플리케이션이 사용할 수 있는 Java Keystore로 자체 서명된 인증서를 가져오는 방법

SSL 연결을 설정할 Java 응용프로그램이 이 인증서를 신뢰하도록 자체 서명된 인증서를 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

그래도 달리려고 하면 다음과 같은 결과를 얻는다.

javax.net.properties.SSLHandshakeException: sun.security.validator.검증자예외: PKIX 경로 빌드 실패: sun.security.provider.certpath.SunCertPathBuilder예외: 요청한 대상에 대한 유효한 인증 경로를 찾을 수 없음

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

  1. portecle 다운로드 및 설치.
  2. 먼저 프로그램 실행에 사용되는 JRE 또는 JDK를 100% 알고 있는지 확인하십시오.64비트 윈도우 7에는 꽤 많은 JRE가 있을 수 있다.프로세스 탐색기가 이를 지원하거나 다음을 사용할 수 있음:System.out.println(System.getProperty("java.home"));
  3. JAVA_ 파일 복사HOME\lib\security\cacerts to other folder.
  4. Portecle에서 File > Open Keystore File을 클릭한다.
  5. 캐시 파일 선택
  6. 이 암호 입력: 변경
  7. 도구 > 신뢰할 수 있는 인증서 가져오기 클릭
  8. mycertificate 파일을 찾아보십시오.
  9. 가져오기 클릭
  10. 신뢰 경로에 대한 경고를 보려면 확인을 누르십시오.
  11. 인증서에 대한 세부 정보가 표시되면 확인을 누르십시오.
  12. 인증서를 신뢰할 수 있는 인증서로 승인하려면 예를 누르십시오.
  13. 별칭을 요청하면 확인을 누르고 인증서를 가져왔다고 하면 확인을 다시 누르십시오.
  14. 저장을 누르십시오.이것을 잊지 마라. 그렇지 않으면 거스름돈이 없어진다.
  15. 파일을 찾은 위치로 복사하십시오.

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 keystore로 인증서 가져오기:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
    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"

결국 키스토어에 인증서를 추가하는 작은 스크립트를 작성하게 되어 훨씬 사용하기 편하다.

최신 버전은 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

```

이것은 나에게 효과가 있었다. :)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit

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

  1. 윈도우즈 탐색기를 열고 AX Core Client가 설치된 jre\lib\security 하위 폴더에 있는 cacerts 파일로 이동하십시오.기본 위치는 C:\Program Files\ 입니다.ACL 소프트웨어\AX Core Client\jre\lib\security

  2. 변경하기 전에 파일의 백업 복사본을 만드십시오.

  3. 사용 중인 인증 기관에서 받은 인증서에 따라 중간 인증서 및/또는 루트 인증서를 캐시 파일로 가져와야 할 수 있다.인증서를 가져오려면 다음 구문을 사용하십시오.

    keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>

  4. 두 인증서를 모두 가져오는 경우 각 인증서에 대해 지정된 별칭이 고유해야 한다.

  5. 암호 프롬프트에 키 저장소의 암호를 입력하고 Enter 키를 누르십시오.cacerts 파일의 기본 Java 암호는 "changeit"이다.이 인증서를 신뢰하시겠습니까? 프롬프트에 'y'를 입력하고 Enter 키를 누르십시오.

사용할 수 있다keytool, 자바 설치는 자바 설치 입니다.$JAVA_HOME/bin는 자바키스토어가 $JAVA_HOME/lib/security/cacerts또는$JAVA_HOME/jre/lib/security/cacertsJDK 또는 JRE를 설치했는지에 따라 달라진다.

자바 9 이상을 사용하면 정확한 위치를 알 필요가 없다.당신은 그것을 사용할 수 있다.-cacerts지름길로 선택하다

자바 9+

따라서 Java 9(Java 1.9라고 함) 이상에서는 간단하게

keytool -importcert -trustcacerts -cacerts -file myCert.pem -alias myCert

이전 Java 버전

Java 8(일명 1.8) 이상에서는 다음과 같이 키 저장소 위치를 지정해야 한다.

keytool -importcert -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -file myCert.pem -alias myCert

1.5)에서는 자바 5(일명 1.5)를 -importcert옵션이 존재하지 않음.라고 불렸다.-import하지만 그렇지 않으면 똑같아그러니 사용하라.

keytool -import -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -file myCert.pem -alias myCert

추가 옵션

  • 신뢰 저장소 암호를 묻는 메시지가 표시되며 기본 암호는 changeit입니다.
  • 가져오기를 자동으로 실행해야 하는 경우-storepass changeit -noprompt

형식

keytoolX.509 v1, v2, v3 인증서 및 해당 유형의 인증서(P7B)로 구성된 PKCS#7 형식 인증서 체인을 가져올 수 있음가져올 데이터가 제공되어야 함

  • 이진 인코딩 형식(DER) 중 하나
  • 또는 인쇄 가능한 인코딩 형식(base64 인코딩이라고 함)으로, 다음 형식으로 둘러싸인-----BEGIN그리고-----END선(PEM)

참고: PEM 형식의 인증서 체인이 실제로 작동하는지 잘 모르겠다.

보너스 스크립트

유감스럽지만, 이 방법은 Windows 사용자들을 위한 것이 아니다.

스택오버플로우(stackoverflow)에 대한 몇 가지 유용한 질문과 스마트한 답변 덕분에 만들어진 이 간단한 스크립트는 Java 버전을 확인하고 필요한 경우 올바른 키 저장소 위치를 결정하며, 하나의 명령어로 여러 개의 인증서를 가져올 수 있다.파일 패턴 인수를 작은 따옴표로 전달해야 한다는 점에 유의하십시오(사용법 참조).

추가 인증서

#!/bin/bash

# Add custom root certificates to Java trust store

if [ "$#" -ne 1 ]; then
    SCRIPT=`basename "$0"`
    echo "Usage: $SCRIPT 'path/to/certs/*'"
    exit 1
fi

CERTFILES=$1    

JAVA_VERSION=`java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1`

if (( $JAVA_VERSION >= 9 )); then
    CACERTS="-cacerts"
else    
    # Check where cacerts are located
    # differs depending or jdk or jre installed
    if [ -d "$JAVA_HOME/jre" ]; then
        CACERTS="$JAVA_HOME/jre"
    else
        CACERTS="$JAVA_HOME"
    fi
    CACERTS="-keystore $CACERTS/lib/security/cacerts"   
fi      

# Now add certificates 
for CERTFILE in $CERTFILES; do
    # Remove path, then suffix to derive alias from filename
    ALIAS=${CERTFILE##*/}  
    ALIAS=${ALIAS%.*}
    $JAVA_HOME/bin/keytool -importcert -file "$CERTFILE" -alias "$ALIAS" $CACERTS -trustcacerts -storepass changeit -noprompt
    if [ $? -ne 0 ]; then
        echo "Failed to add $CERTFILE as $ALIAS to $CACERTS"
        exit 1
    fi  
done

제공자로부터 인증서를 가져오십시오..cer로 끝나는 파일을 만들고 인증서를 붙여 넣으십시오.

텍스트 파일을 복사하거나 액세스할 수 있는 위치에 붙여넣은 후 cmd 프롬프트를 admin 및 cd로 jdk의 bin에 사용하십시오. 사용할 명령은 다음과 같다.keytool

다음을 사용하여 키 저장소 암호 변경:

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

암호:changeit

그러면 새 암호를 두 번 입력하라는 메시지가 나타날 것이다.그런 다음 다음을 입력하십시오.

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"

간단한 명령 'keytool'은 Windows 및/또는 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 명령을 내부에서 실행하십시오. 여기서 새 인증서의 마지막 경로를 지정하십시오.

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

만약 이게 싸이그윈 밑에 있다면, 당신은 싸이그윈이 아닌 프로그램으로 가는 길을 주는 것이기 때문에, 그 경로는 DOS와 비슷하고 인용문으로 되어있다.

시도해보고 싶을 수도 있다.

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

난 솔직히 네가 그냥 쓰면 증명서가 어디에 있는지 모르겠어.cacerts끝까지 해내다.

Java 리눅스에 인증서 설치

/opt/jdk(버전)/bin/keytool -import -file aliasname -file certificate.cer -keystore cacerts -storepass 암호

윈도우즈에서는 다음 명령어가 명령줄에서 작동함:

cd C:\Program Files\Java\jre1.8.0_301\lib\security\
keytool -import -trustcacerts -alias cert_ssl -file C:\opt\esb-config\keystores\cert.cer -noprompt -storepass changeit -keystore cacerts

changeit트러스트 저장소의 기본 암호.

참조URL: https://stackoverflow.com/questions/11617210/how-to-properly-import-a-selfsigned-certificate-into-java-keystore-that-is-avail

반응형