Java Keystore를 PEM 형식으로 변환


132

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

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

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

답변:


214

적어도 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

12
이 메소드에서는 신뢰할 수있는 인증서가 지원되지 않습니다. 이것은 내가 참조하는 PKS12 형식의 제한 사항입니다. java.sun.com/javase/6/docs/technotes/guides/security/jsse/…(java.security.KeyStoreException의 섹션 : TrustedCertEntry 지원되지 않음)
andygavin

2
오래된 JKS 파일이 있습니다. 위의 방법을 사용하여 내보낼 수 없습니다. 나는 keytool arg '-destkeypass'를 더미 값으로 설정하여 마침내 그것을 할 수있었습니다. 'keytool'은 destkeypass 값을 무시한다는 경고 메시지를 표시합니까? 다른 기술은 작동하지 않습니다. 프롬프트를 사용하면 작동하지 않고 명령 줄 인수에서만 작동합니다. PKCS12 내보내기에서 버그 여야합니다.
cmcginty

4
"openssl pkcs12 -in foo.p12 -out foo.pem"에서 다음 오류가 발생합니다. 비밀번호 가져 오기를 입력하십시오. MAC 인증 확인 키 및 인증서 출력 오류 139848775526048 : error : 06065064 : digital envelope 루틴 : EVP_DecryptFinal_ex : bad decrypt : evp_enc.c : 539 : 139848775526048 : 오류 : 23077074 : PKCS12 루틴 : PKCS12_pbe_crypt : pkcs12 암호 오류 : p12_decr.c : 104 : 139848775526048 : error : 2306A075 : PKCS12 루틴 : PKCS12_item_decrypt_d2i : errorsc12 pbe crypt. 이것에 대한 해결책은 무엇입니까?
Udara SS Liyanage

1
내보내기가 완료 될 때까지 다른 사람들을위한 경고의 키 도구 명령은 어떤 이유로 완료하는 데 시간이 걸립니다, 나는 30 초를 기다려야했다
니콜라스 Mommaerts을

1
UdaraS.SLiyanage @ 솔루션에 대한 케이시의 대답 봐
니콜라스 Mommaerts

29

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, 인수의 가치는 중요하지 않았다.


6
추론은 여기에서 찾을 수 있습니다 : herongyang.com/PKI/... 의 destkeypass은 BTW 중요합니까
니콜라스 Mommaerts을

나는이 의견을 찬성했지만 그것은 자신의 게시물이 가치가있다. 여기서 찾기가 힘들었습니다.
Richie Rich

15

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

감사합니다 erickson. "결론은"keytool 및 openssl 유틸리티를 사용하여 JKS에서 PEM으로 직접 변환 할 수 없습니다 "입니다. 나 맞아?
Chathuranga Chandrasekara

4
당신은 필요 자바 1.4로 코드를 작성까지 -> PKCS # 12 - -> PEM, 키 도구 및하려면 openssl이 JKS에서 2 단계 변환을 수행하기 위해 결합 될 수 이후 자바 5에서. 그러나 직접 키 도구를 작성하는 것이 JKS-> PEM에서 직접 변환 을 수행하는 유일한 방법 입니다.
Stobor

JDK 6부터 나온 것 같습니다. 그러나 PKCS # 12 가져 오기가 지원됩니다.
erickson

13

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

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

10
그렇습니다. 인증서를 내 보냅니다. 그러나 주요 정보는 수출하지 않습니다.
Stobor

이것은 내가 수십에서 검색 있었는지에 대한 정확한 간단한 답변입니다 keytooljboss성공없이 문서 페이지를 참조하십시오. 감사!
kratenko

15
이것은 중요한 정보를 수출하지 않습니다
James

1
공개 키 인증서를 수출
asami

이 명령을 실행하려고했습니다. 비밀번호가 필요합니다. 키 저장소 비밀번호를 입력하십시오. keytool 오류 : java.io.IOException : 키 저장소가 변경되었거나 비밀번호가 올바르지 않습니다. 암호를 (암호)로 사용했지만 같은 오류가 발생했습니다.
Mohit Singh

9

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>


2

다음 명령을 사용하여 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'파일에 작성하십시오.

3
bash :! d ": 이벤트를 찾을 수 없음
user3217883

1
@ user3217883 sed "s/^\-*BEGIN [A-Z]*\-*$//g;s/^\-*END [A-Z]*\-*$//g"대신에 (gnu sed로) 시도해 볼 수 있지만 키 스토어에 하나 이상의 인증서가 있다면 충분하지 않습니다.
Idriss Neumann

당신이 얻는다면 bash: !d": event not found: bash의 경우 느낌표는 명령을 사용하는 짧은 열쇠입니다. 이 답변을 사용하려면 sed에 대해 -e로 사용 된 옵션에 대해 따옴표 대신 아포스트로피를 사용해야합니다keytool -list -rfc -keystore "myKeystore.jks" | sed -e '/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d' >> "myKeystore.pem"
B.Adler

불행히도, 이것은 개인 키가 아닌 인증서 만 내 보냅니다
Maddin

2

먼저 키 저장소를 JKS에서 PKCS12로 덤프하십시오.

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

새 pkcs12 파일을 pem에 덤프하십시오.

  1. openssl pkcs12-중간 .p12-노드-중간 .rsa.pem

인증서 및 개인 키가 모두 pem 형식이어야합니다. 그들을 나누십시오. “BEGIN CERTIFICATE”와“END CERTIFICATE”사이의 부분을 cert.x509.pem에 넣습니다.“BEGIN RSA PRIVATE KEY”와“END RSA PRIVATE KEY”사이에 부분을 private.rsa.pem에 넣습니다. 개인 키를 pk8 형식으로 변환합니다. signapk에 의해 예상

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


1

글쎄, 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

오류 / 실패에 대한 자세한 내용이 있습니까?


1

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

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

  1. JKS 키 저장소를 엽니 다.
  2. 개인 키 항목을 마우스 오른쪽 버튼으로 클릭하고 내보내기를 선택하십시오.
  3. 개인 키 및 인증서 및 PEM 형식을 선택하십시오.

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



0

먼저 키 저장소 파일을 다음과 같이 작성하십시오.

C : \ Program Files \ Android \ Android Studio \ jre \ bin> keytool -keystore androidkey.jks -genkeypair-별칭 안드로이드

키 저장소 비밀번호 입력 :
새 비밀번호 재 입력 :
이름과 성은 무엇입니까? 알 수 없음 : 이름 성
조직 단위의 이름은 무엇입니까? 알 수 없음 : 모바일 개발
조직의 이름은 무엇입니까? 알 수 없음 : 회사 이름
도시 또는 지방의 이름은 무엇입니까? 주 또는 도의 이름은 무엇입니까?
이 기기의 2 자리 국가 코드는 무엇입니까? 알 수 없음 : IN // 입력 엔터

이제 확인을 요청합니다

CN = 이름 성, OU = 모바일 개발, O = 회사 이름, L = 도시 이름, ST = 상태 이름, C = IN입니까? [아니요] :

(키 저장소 비밀번호와 동일한 경우 RETURN)에 키 비밀번호를 입력하십시오. 동일한 비밀번호를 원하면 Enter를 누르십시오.

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

C : \ Program Files \ Android \ Android Studio \ jre \ bin> keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
키 저장소 비밀번호 입력 :
파일에 저장된 인증서


0

Java Keystore를 PEM 형식으로 변환

가장 정확한 대답은 이것이 불가능하다는 것입니다.

Java 키 저장소는 암호화 키 인증서 의 저장 기능 일 뿐이며 PEM은 X.509 인증서의 파일 형식입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.