[java] Java Keystore를 PEM 형식으로 변환

keytool 및 openssl 응용 프로그램을 사용하여 Java 키 저장소 파일에서 PEM 파일로 변환하려고합니다. 그러나 나는 전환을 수행하는 좋은 방법을 찾지 못했습니다. 어떤 아이디어?

키 저장소를 PEM으로 직접 변환하는 대신 PKCS12 파일을 먼저 작성한 다음 관련 PEM 파일 및 키 저장소로 변환하려고했습니다. 그러나 그것들을 사용하여 연결을 설정할 수 없습니다. (보안 연결을 구현하려면 PEM 파일과 키 저장소 파일 만 있으면됩니다. “java 키 저장소 파일에서 시작”과 같은 제한은 없습니다.

그러나 jks에서 pem으로 직접 변환하는 방법이 바람직합니다.



답변

적어도 jdk6을 사용하는 것은 매우 간단합니다 …

bash $ keytool -keystore foo.jks -genkeypair-별명 foo \
        -dname 'CN = foo.example.com, L = 멜버른, ST = 빅토리아, C = AU'
키 저장소 비밀번호를 입력하십시오.
새 비밀번호를 다시 입력하십시오 :
에 대한 키 비밀번호를 입력하십시오
        (키 저장소 비밀번호와 동일한 경우 리턴) :
bash $ keytool -keystore foo.jks -exportcert-별칭 foo | \
       openssl x509-정보 der- 텍스트
키 저장소 비밀번호를 입력하십시오. asdasd
증명서:
    데이터:
        버전 : 3 (0x2)
        일련 번호 : 1237334757 (0x49c03ae5)
        서명 알고리즘 : dsaWithSHA1
        발급자 : C = AU, ST = 빅토리아, L = 멜버른, CN = foo.example.com
        타당성
            비정기 : 3 월 18 일 00:05:57 2009 GMT
            이후 : Jun 16 00:05:57 2009 GMT
        제목 : C = AU, ST = 빅토리아, L = 멜버른, CN = foo.example.com
        주제 공개 키 정보 :
            공개 키 알고리즘 : dsaEncryption
            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 \
       -srcstoretype jks \
       -deststoretype pkcs12
대상 키 저장소 비밀번호를 입력하십시오.
새 비밀번호를 다시 입력하십시오 :
소스 키 저장소 비밀번호를 입력하십시오.
별명 foo에 대한 항목을 가져 왔습니다.
가져 오기 명령 완료 : 1 개의 항목을 성공적으로 가져 왔으며 0 개의 항목이 실패했거나 취소되었습니다.

bash $ openssl pkcs12 -in foo.p12 -out foo.pem
비밀번호 가져 오기를 입력하십시오.
MAC 확인 OK
PEM 암호 문구를 입력하십시오 :
확인-PEM 암호 문구를 입력하십시오.

bash $ openssl x509-텍스트-foo.pem
증명서:
    데이터:
        버전 : 3 (0x2)
        일련 번호 : 1237334757 (0x49c03ae5)
        서명 알고리즘 : dsaWithSHA1
        발급자 : C = AU, ST = 빅토리아, L = 멜버른, CN = foo.example.com
        타당성
            비정기 : 3 월 18 일 00:05:57 2009 GMT
            이후 : Jun 16 00:05:57 2009 GMT
        제목 : C = AU, ST = 빅토리아, L = 멜버른, CN = foo.example.com
        주제 공개 키 정보 :
            공개 키 알고리즘 : dsaEncryption
            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.pem
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의 명령을 사용할 때 계속 오류가 발생합니다 .

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명령을 사용하면 키 저장소에서 개인 키를 내보낼 수 없습니다. 이를 위해 Java 코드를 작성해야합니다. 키 저장소를 열고 필요한 키를 얻은 다음 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


답변

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

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.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>


답변

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

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

그런 다음 공개 / 개인 키 쌍을 private.key publi.pem 파일로 나누면 작동합니다!


답변

다음 명령을 사용하여 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 만 남았습니다.
  3. >> "myKeystore.pem" PEM을 ‘myKeyStore.pem’파일에 작성하십시오.