문제

keytool 및 openssl applicactions를 사용하여 Java 키 저장소 파일을 PEM 파일로 변환하려고 합니다.하지만 변환을 수행하는 좋은 방법을 찾을 수 없었습니다.어떤 아이디어가 있나요?

키 저장소를 PEM으로 직접 변환하는 대신 먼저 PKCS12 파일을 만든 다음 관련 PEM 파일과 키 저장소로 변환하려고 했습니다.그러나 나는 그것들을 사용하여 연결을 설정할 수 없었습니다.(보안 연결을 구현하려면 PEM 파일과 Keystore 파일만 필요합니다."Java 키 저장소 파일에서 시작"과 같은 제한은 없습니다.:) 따라서 내 경우에는 다른 형식으로 시작하는 것이 허용됩니다)

그러나 jks에서 pem으로 직접 변환하는 방법이 더 좋습니다.

도움이 되었습니까?

해결책

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

bash$ keytool -keystore foo.jks -genkeypair -alias foo \
        -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'
Enter keystore password:  
Re-enter new password: 
Enter key password for 
        (RETURN if same as keystore password):  
bash$ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509 -inform der -text
Enter keystore password:  asdasd
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1237334757 (0x49c03ae5)
        Signature Algorithm: dsaWithSHA1
        Issuer: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
        Validity
            Not Before: Mar 18 00:05:57 2009 GMT
            Not After : Jun 16 00:05:57 2009 GMT
        Subject: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
        Subject Public Key Info:
            Public Key Algorithm: dsaEncryption
            DSA Public Key:
                pub: 
                    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
Enter destination keystore password:  
Re-enter new password: 
Enter source keystore password:  
Entry for alias foo successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled

bash$ openssl pkcs12 -in foo.p12 -out foo.pem
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

bash$ openssl x509 -text -in foo.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1237334757 (0x49c03ae5)
        Signature Algorithm: dsaWithSHA1
        Issuer: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
        Validity
            Not Before: Mar 18 00:05:57 2009 GMT
            Not After : Jun 16 00:05:57 2009 GMT
        Subject: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
        Subject Public Key Info:
            Public Key Algorithm: dsaEncryption
            DSA Public Key:
                pub: 
                    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
read DSA key
Enter PEM pass phrase:
Private-Key: (1024 bit)
priv:
    00:8f:b1:af:55:63:92:7c:d2:0f:e6:f3:a2:f5:ff:
    1a:7a:fe:8c:39:dd
pub: 
    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- 자바 형식의 키 스토어.
  • foo.p12- PKCS#12 형식의 키 스토어.
  • foo.pem- Keystore의 모든 키와 세기, PEM 형식의 Keystore.

(이 마지막 파일은 원하는 경우 키와 인증서로 나눌 수 있습니다.)


명령 요약 - JKS 키 스토어 생성 :

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

명령 요약 - JKS KeyStore를 PKCS#12 Keystore로 변환 한 다음 PEM 파일로 변환합니다.

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

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

JKS KeyStore에 두 개 이상의 인증서가 있고 별명 중 하나와 관련된 인증서 및 키 만 내보내려면 다음 변형을 사용할 수 있습니다.

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

다른 팁

나는 계속 오류를 얻었습니다 openssl stobor의 명령을 사용할 때 :

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으로 변환하고 키 형식 (.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

그런 다음 쌍 Public/Private Key를 두 개의 파일 Private.key publi.pem으로 나누었습니다.

잘, 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

오류/실패가 무엇인지에 대한 자세한 내용은?

JKS 키 스토어를 단일 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'키 스토어의 모든 것을 PEM 형식으로 나열합니다. 그러나 추가 정보도 인쇄합니다.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" 필요하지 않은 모든 것을 필터링합니다. 우리는 Keystore의 모든 Pems 만 남습니다.
  3. >> "myKeystore.pem" PEMS를 'MykeyStore.pem'파일에 씁니다.

OpenSSL이 설치되지 않았고 빠른 솔루션을 찾고있는 경우 소프트웨어가 호출됩니다. 포트 클 매우 유용하고 다운로드하기에 작습니다.

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

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

    Export PEM private key from JKS with Portcle

Keystore Explorer를 사용해보십시오 http://keystore-explorer.org/

Keystore Explorer는 Java Command-Line Utilities KeyTool 및 Jarsigner의 오픈 소스 GUI 교체품입니다. OPENSSL/PKCS12도 있습니다.

먼저 키 저장소 파일을 다음과 같이 만듭니다.

C:\Program Files\Android\Android Studio\jre\bin>keytool -keystore androidkey.jks -genkeypair -alias androidkey

키 저장소 비밀번호를 입력하세요:
새 비밀번호를 다시 입력하세요.
당신의 성과 이름은 무엇입니까?알려지지 않은: 이름 성
귀하의 조직 단위 이름은 무엇입니까?알려지지 않은: 모바일 개발
귀하의 조직 이름은 무엇입니까?알려지지 않은: 당신의 회사 이름
귀하의 도시 또는 지역의 이름은 무엇입니까?귀하의 주 또는 지역 이름은 무엇입니까?
이 장치의 두 글자 국가 코드는 무엇입니까?알려지지 않은:IN //엔터를 누른다

이제 확인을 요청합니다

CN=FirstName LastName, OU=Mobile Development, O=회사 이름, L=CityName, ST=StateName, C=IN이 맞나요?[아니요]:

키 비밀번호를 입력하십시오 (KeyStore 비밀번호와 동일한 경우 반환) :동일한 비밀번호를 원하면 Enter를 누르세요

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

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

먼저 Keystore를 JK에서 PKCS12로 덤프하십시오

1. KeyTool -ImportKeyStore -SrckeyStore ~/. Android/Debug.Keystore -DestKeyStore intermediate.p12 -SrcStoreType JKS -DestStoreType PKCS12

새 PKCS12 파일을 PEM에 덤프하십시오

  1. OpenSSL PKCS12 -IN intermediate.p12 -nodes -out intermediate.rsa.pem

PEM 형식의 CERT 및 Private Key가 모두 있어야합니다. 그들을 분할하십시오. "인증서 시작"과 "종료 인증서"사이에 부품을 CERT.X509.PEM에 "시작 RSA 개인 키"와 "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

Java Keystore를 PEM 형식으로 변환합니다

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

Java Keystore는 암호화 키를위한 스토리지 시설 일뿐입니다. 그리고 PEM 인증서는 X.509 인증서에 대한 파일 형식입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top