programing

Java 키스토어의 PEM 포맷으로의 변환

newsource 2022. 9. 26. 23:04

Java 키스토어의 PEM 포맷으로의 변환

keytool과 openssl actions를 사용하여 Java keystore 파일에서 PEM 파일로 변환하려고 합니다.그러나 나는 변환하는 좋은 방법을 찾을 수 없었다.좋은 생각 있어요?

Keystore를 직접 PEM으로 변환하는 대신 먼저 PKCS12 파일을 작성한 후 관련 PEM 파일과 Keystore로 변환하려고 했습니다.그러나 이들을 사용하여 연결을 확립할 수 없었습니다.(보안된 연결을 구현하려면 PEM 파일과 Keystore 파일만 필요합니다."Java keystore 파일에서 시작"과 같은 제한은 없습니다.그래서 다른 형식에서 시작하는 것은 제 경우 괜찮습니다.)

그러나 jks에서 pem으로 직접 변환하는 방법이 선호됩니다.

jdk6를 사용하는 것은 매우 간단합니다.

bash$ keytool - keystore foo.jks - genkeypair - foo \-dname 'CN=foo.example.com, L=Latrix,ST=스위치,C=AU'keystore 비밀번호 입력:새 암호 다시 입력:키 패스워드 입력(키스토어 비밀번호와 같은 경우 반환):  
bash$ keytool - keystore foo.jks - exportcert - foo | \openssl x509 - der - textkeystore 비밀번호 입력: asdasd증명서:
데이터:버전: 3 (0x2)시리얼 번호: 1237334757 (0x49c03ae5)시그니처 알고리즘: dsaWithSHA1발행자:C=AU, ST=Matrix, L=Matrix, CN=foo.example.com유효성이전 외: 2009년 3월 18일 00:05:57 GMT다음 날짜 외 : 2009년 6월 16일 00:05:57 GMT제목:C=AU, ST=Matrix, L=Matrix, CN=foo.example.com제목 공개 키 정보:
공개키 알고리즘: dsa 암호화DSA 공개 키:퍼브:00:e2:66:5c:e0:2e:da:e0:6b:a6:aa:97:64:59:14:
7e:a6:2e:5a:45:f9:2f:b5:2d:f4:34:27:e6:53:c7:
 

bash$keytool -importkeystore -srckeystore foo.jks \- destkeystore foo.p12 \- srcstore type jks \- deststore type pkcs12대상 키 저장소 암호 입력:새 암호 다시 입력:소스 키 저장소 암호 입력:별칭 foo 항목을 가져왔습니다.
가져오기 명령 완료: 1개 항목을 성공적으로 가져왔습니다. 0개 항목이 실패하거나 취소되었습니다.
bash$ openssl pkcs12 - in foo.p12 -out foo.Import Password 입력:
MAC 확인 완료PEM 패스 프레이즈를 입력합니다.
확인 중 - PEM 암호 구문을 입력합니다.

bash$ openssl x509 -text -in foo.증명서:
데이터:버전: 3 (0x2)시리얼 번호: 1237334757 (0x49c03ae5)시그니처 알고리즘: dsaWithSHA1발행자:C=AU, ST=Matrix, L=Matrix, CN=foo.example.com유효성이전 외: 2009년 3월 18일 00:05:57 GMT다음 날짜 외 : 2009년 6월 16일 00:05:57 GMT제목:C=AU, ST=Matrix, L=Matrix, CN=foo.example.com제목 공개 키 정보:
공개키 알고리즘: dsa 암호화DSA 공개 키:퍼브:00:e2:66:5c:e0:2e:da:e0:6b:a6:aa:97:64:59:14:
7e:a6:2e:5a:45:f9:2f:b5:2d:f4:34:27:e6:53:c7:
 

bash$openssl dsa -text -in foo.DSA 키 읽기PEM 패스 프레이즈를 입력합니다.
개인 키: (1024 비트)개인 정보:00:8f:b1:af:55:63:92:7c:d2:0f:e6:f3:a2:f5:ff:
1a:7a:fe:8c:39:dd퍼브:00:e2:66:5c:e0:2e:da:e0:6b:a6:aa:97:64:59:14:
7e:a6:2e:5a:45:f9:2f:b5:2d:f4:34:27:e6:53:c7:



다음과 같은 결과가 됩니다.

  • foo.jks - Java 형식의 키스토어
  • foo.p12 - PKCS#12 형식의 키스토어
  • foo.pem - 키스토어의 모든 키 및 증명서(PEM 형식).

(이 마지막 파일은 필요에 따라 키와 증명서로 분할할 수 있습니다).


명령 요약 - JKS 키 저장소를 만들려면:

keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

명령어 요약 - JKS 키스토어를 PKCS#12 키스토어로 변환한 후 PEM 파일로 변환하려면 다음 절차를 수행합니다.

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

JKS 키스토어에 여러 개의 증명서가 있으며 에일리어스 중 하나와 관련된 증명서와 키만 내보내는 경우 다음 종류를 사용할 수 있습니다.

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

명령어 요약 - JKS 키스토어를 PEM 파일과 비교하려면:

keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem

opensslStoBor sto sto sto sto sto :

MAC verified OK
Error outputting keys and certificates
139940235364168:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:535:
139940235364168:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:p12_decr.c:97:
139940235364168:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:p12_decr.c:123:

어떤 이유에서인지 JKS 파일에는 이 스타일의 명령어만 사용할 수 있습니다.

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

열쇠가 설정되었습니다.destkeypass인수의 값은 중요하지 않았습니다.

keytool을 사용하여 jks에서 pem 파일로 직접 변환

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem

keytool명령에서는 키 저장소에서 개인 키를 내보낼 수 없습니다.자바어키 저장소를 열고 필요한 키를 가져와 PKCS #8 형식의 파일에 저장합니다.이치노

KeyStore ks = KeyStore.getInstance("jks");
/* Load the key store. */
...
char[] password = ...;
/* Save the private key. */
FileOutputStream kos = new FileOutputStream("tmpkey.der");
Key pvt = ks.getKey("your_alias", password);
kos.write(pvt.getEncoded());
kos.flush();
kos.close();
/* Save the certificate. */
FileOutputStream cos = new FileOutputStream("tmpcert.der");
Certificate pub = ks.getCertificate("your_alias");
cos.write(pub.getEncoded());
cos.flush();
cos.close();

OpenSSL 유틸리티를 사용하여 이러한 파일(바이너리 형식)을 PEM 형식으로 변환합니다.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem

JKS 파일을 PEM 및 KEY 형식(.crt & .key)으로 변환하는 간단한 절차:

keytool -importkeystore -srckeystore <Source-Java-Key-Store-File> -destkeystore <Destination-Pkcs12-File> -srcstoretype jks -deststoretype pkcs12 -destkeypass <Destination-Key-Password>

openssl pkcs12 -in <Destination-Pkcs12-File> -out <Destination-Pem-File>

openssl x509 -outform der -in <Destination-Pem-File> -out <Destination-Crt-File>

openssl rsa -in <Destination-Pem-File> -out <Destination-Key-File>

JKS KeyStore를 단일 PEM 파일로 변환하려면 다음 명령을 사용합니다.

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"

설명:

  1. keytool -list -rfc -keystore "myKeystore.jks"'myKeyStore.jks' KeyStore는 PEM을 사용합니다.그러나 추가 정보도 출력합니다.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d".KeyStore PEM key key key 。
  3. >> "myKeystore.pem"PEM의 'myKeyStore.pem'입니다.

openssl이 설치되어 있지 않고 빠른 솔루션을 찾고 있는 경우 portcle이라는 소프트웨어가 있어 매우 유용하고 다운로드가 용이합니다.

단점은 제가 아는 한 명령줄이 없다는 것입니다.단, GUI에서 PEM 개인 키를 내보내는 것은 매우 간단합니다.

  1. JKS 키스토어 열기
  2. 개인 키 항목을 마우스 오른쪽 버튼으로 클릭하고 내보내기를 선택합니다.
  3. 개인 키와 증명서 및 PEM 형식을 선택합니다.

    Portcle을 사용하여 JKS에서 PEM 개인 키 내보내기

먼저 키스토어를 JKS에서 PKCS12로 덤프합니다.

1. keytool - importkeystore - srckeystore ~/.disc/disc.keystore - destkeystore intermediate.p12 - srcstoretype JKS - deststoretype PKCS12

새 pkcs12 파일을 pem에 덤프합니다.

  1. openssl pkcs12 - in in in in in in intermediate.p12 - intermediate - out intermediate.pem

pem 형식의 cert 키와 개인 키를 모두 가지고 있어야 합니다.그들을 갈라놓아라."BEGIN CERTIFICATE"와 "END CERTIFICATE" 사이의 부품을 cert.x509.pem에 넣습니다.BEGIN RSA PRIVATE KEY"와 "END RSA PRIVATE KEY" 사이의 부품을 private.rsa.pem signapk에서 예상한 대로 pk8 형식으로 변환합니다.

3. openssl pkcs8 - topk8 - outform DER - in private . rsa . pem - inform PEM - out private . pk8 - nocrypt

매우 흥미로운 해결책을 찾았습니다.

http://www.swview.org/node/191

그 후 공용/비밀키 쌍을 개인 파일 2개로 나누었습니다.키퍼블리펨, 작동해!

OpenSSL은 #12 파일에서 쉽게 실행할 수 있습니다.

openssl pkcs12 -in pkcs-12-certificate-file -out pem-certificate-file
openssl pkcs12 -in pkcs-12-certificate-and-key-file -out pem-certificate-and-key-file

오류/장애에 대한 자세한 내용은 무엇입니까?

Keystore Explorer http://keystore-explorer.org/ 를 사용해 보세요.

KeyStore Explorer는 Java 명령줄 유틸리티 키툴과 jarsigner를 대체하는 오픈소스 GUI입니다.openssl/pkcs12도 동작합니다.

먼저 키스토어 파일을 만듭니다.

C:\Program Files\안드로이드\Android Studio\jre\bin> keytool - keystore oridkey.jks - genkeypair - alias Androidkey

keystore 비밀번호 입력:
새 암호 다시 입력:
당신의 성과 이름은 무엇입니까?알 수 없는 이름:
조직 단위의 이름은 무엇입니까?불명: 모바일 개발
귀사의 이름은 무엇입니까?알 수 없음: 회사 이름
시 또는 지역 이름이 무엇입니까?당신의 도도부현 이름은 무엇입니까?
이 유닛의 국가 코드는 2글자입니까?알 수 없음: IN // Enter 키를 누릅니다.

이제 확인 메시지가 나타납니다.

CN=이름 성, OU=모바일 개발, O=회사명, L=CityName, ST=StateName, C=맞습니까?[아니오]:

(키스토어 비밀번호와 같은 경우 리턴): 같은 비밀번호를 원할 경우 Enter 키를 누릅니다.

키가 생성되었습니다. 이제 다음 명령을 사용하여 pem 파일을 가져올 수 있습니다.

C:\Program Files\안드로이드\Android Studio\jre\bin> keytool - export - rfc - alias Androidkey - file Android_certificate.pem - keystore oridkey.jks
password keystore " " 를 합니다.
가 파일에 되어 있습니다.

단말기를 열고 jks 파일 위치로 이동하여 이 >>> keytool - export - export - file adroid_classate.pem - keystore adroidkey.jks 를 입력합니다.

keystore 파일이 abcd.jks이고 C:\Data에 있다고 가정합니다.

cmd 창의 파일이 있는 위치에서 다음을 수행합니다.

keytool -export -rfc -keystore C:\Data\abcd.jks -alias abcd -file C:\Data\abcd.pem

프롬프트가 뜨면 다음에 패스워드를 입력하면 지정된 장소에서 변환된 포맷을 얻을 수 있습니다.

여기서 두 가지 명령어를 따르기만 하면 됩니다.

# openssl pkcs12 -info -nodes -in /srv/apache-tomcat-8.5.72/conf/cert.jks -nokeys 2>&1| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > server.crt
Enter Import Password:
# openssl pkcs12 -info -nodes -in /srv/apache-tomcat-8.5.72/conf/cert.jks -nocerts 2>&1| sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > server.key
Enter Import Password:

Java 키스토어의 PEM 포맷으로의 변환

가장 정확한 대답은 이것이 가능하지 않다는 것임에 틀림없다.

Java 키스토어는 암호화 와 증명서를 저장하는 데 불과하지만 PEM은 X.509 증명서만을 위한 파일 형식입니다.

언급URL : https://stackoverflow.com/questions/652916/converting-a-java-keystore-into-pem-format