146

keytool と openssl アプリケーションを使用して、Java キーストア ファイルを PEM ファイルに変換しようとしています。しかし、変換を行う良い方法が見つかりませんでした。何か案は?

キーストアを直接 PEM に変換する代わりに、最初に PKCS12 ファイルを作成してから、関連する PEM ファイルとキーストアに変換しようとしました。しかし、それらを使用して接続を確立できませんでした。(安全な接続を実装するには、PEMファイルとキーストアファイルが必要なだけであることに注意してください。「Javaキーストアファイルから開始する」などの制限はありません。:)私の場合、他の形式から開始してもかまいません)

ただし、 jks から pem への直接変換方法を使用することをお勧めします。

4

15 に答える 15

240

少なくともjdk6を使用すると、かなり簡単です...

bash$ keytool -keystore foo.jks -genkeypair -alias foo \
        -dname 'CN=foo.example.com,L=メルボルン,ST=ビクトリア,C=AU'
キーストアのパスワードを入力してください:  
新しいパスワードを再入力してください:
の鍵パスワードを入力してください
        (キーストアのパスワードと同じ場合は RETURN):  
bash$ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509 -inform der -テキスト
キーストアのパスワードを入力してください: asdasd
証明書:
    データ:
        バージョン: 3 (0x2)
        シリアル番号: 1237334757 (0x49c03ae5)
        署名アルゴリズム: dsaWithSHA1
        発行者: C=AU、ST=ビクトリア、L=メルボルン、CN=foo.example.com
        有効
            前: 3 月 18 日 00:05:57 2009 GMT
            後: 2009 年 6 月 16 日 00:05:57 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 -text -in foo.pem
証明書:
    データ:
        バージョン: 3 (0x2)
        シリアル番号: 1237334757 (0x49c03ae5)
        署名アルゴリズム: dsaWithSHA1
        発行者: C=AU、ST=ビクトリア、L=メルボルン、CN=foo.example.com
        有効
            前: 3 月 18 日 00:05:57 2009 GMT
            後: 2009 年 6 月 16 日 00:05:57 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 キーストアに複数の証明書があり、エイリアスの 1 つに関連付けられた証明書とキーのみをエクスポートする場合は、次のバリエーションを使用できます。

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
于 2009-03-18T00:32:33.857 に答える
30

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で、引数の値は問題ではありませんでした。

于 2012-11-17T02:46:53.457 に答える
19

keytool を使用した jks から pem ファイルへの直接変換

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
于 2011-05-20T19:24:46.800 に答える
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
于 2009-03-17T05:18:15.353 に答える
5

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' KeyStore 内のすべてを PEM 形式でリストします。ただし、追加情報も出力します。
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"必要のないものをすべて除外します。KeyStore 内のすべての PEM だけが残ります。
  3. >> "myKeystore.pem"PEM をファイル「myKeyStore.pem」に書き込みます。
于 2016-02-18T16:02:12.743 に答える
3

最初にキーストアを JKS から PKCS12 にダンプします

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

新しい pkcs12 ファイルを pem にダンプします

  1. openssl pkcs12 -in 中間.p12 -ノード -out 中間.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

于 2018-06-05T10:25:12.077 に答える
2

私は非常に興味深い解決策を見つけました:

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

次に、公開鍵と秘密鍵のペアを 2 つのファイル private.key publi.pem に分割しました。

于 2011-10-04T12:40:21.297 に答える
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

エラー/失敗の詳細について教えてください。

于 2009-03-17T03:46:56.697 に答える