JavaキーストアをPEM形式に変換する


132

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

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

ただし、jksからpemへの直接変換方法が推奨されます。

回答:


214

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

bash $ keytool -keystore foo.jks -genkeypair -alias foo \
        -dname 'CN = foo.example.com、L = Melbourne、ST = Victoria、C = AU'
キーストアのパスワードを入力してください:  
新しいパスワードを再入力してください: 
のキーパスワードを入力してください 
        (キーストアのパスワードと同じ場合はRETURN):  
bash $ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509 -inform der -text
キーストアのパスワードを入力してください:asdasd
証明書:
    データ:
        バージョン:3(0x2)
        シリアル番号:1237334757(0x49c03ae5)
        署名アルゴリズム:dsaWithSHA1
        発行者:C = AU、ST =ビクトリア、L =メルボルン、CN = foo.example.com
        有効
            前に:2009年3月18日00:05:57 GMT
            後ではない:6月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 -text -in foo.pem
証明書:
    データ:
        バージョン:3(0x2)
        シリアル番号:1237334757(0x49c03ae5)
        署名アルゴリズム:dsaWithSHA1
        発行者:C = AU、ST =ビクトリア、L =メルボルン、CN = foo.example.com
        有効
            前に:2009年3月18日00:05:57 GMT
            後ではない:6月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ビット)
priv:
    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

12
信頼できる証明書はこの方法ではサポートされていません。これは、PKS12形式の制限であり、私が信じているものです。java.sun.com / javase / 6 / docs / technotes / guides / security / jsse /…(java.security.KeyStoreExceptionのセクション:TrustedCertEntryはサポートされていません)
andygavin 2009

2
古いJKSファイルがあります。上記の方法ではエクスポートできませんでした。keytool arg '-destkeypass'をダミー値に設定することで、最終的にそれを行うことができました。「keytool」は、destkeypass値を無視しているという警告を表示しますか?他の手法は機能しません。プロンプトの使用は機能せず、コマンドライン引数からのみ機能します。PKCS12エクスポートのバグである必要があります。誰でもコメントできますか?
cmcginty 2012年

4
「openssl pkcs12 -in foo.p12 -out foo.pem」が次のエラーをスローするインポートパスワードの入力:MAC検証済みOKキーと証明書の出力エラー139848775526048:error:06065064:デジタルエンベロープルーチン:EVP_DecryptFinal_ex:bad復号化:evp_enc.c:539 :139848775526048:error:23077074:PKCS12ルーチン:PKCS12_pbe_crypt:pkcs12暗号最終エラー:p12_decr.c:104:139848775526048:error:2306A075:PKCS12ルーチン:PKCS12_item_decrypt_d2i:pkcs12 pbe cryptエラー:p12暗号エラー:p12 これに対する解決策は何ですか?
Udara SS Liyanage 2013年

1
他の人への警告、keytoolコマンドは何らかの理由で完了するまでに時間がかかります。エクスポートが完了するまで30秒待つ必要がありました
Nicolas Mommaerts

1
@ UdaraS.SLiyanage:解決策に関するCaseyの回答を見てください
Nicolas 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は重要です
Nicolas Mommaerts 2013年

私はこのコメントに賛成しましたが、それはそれ自身の投稿に値します。ここで見つけるのは大変でした。
リッチーリッチ

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への直接変換を実行できない」です。私は正しいですか?
チャトゥランガチャンドラセカラ

4
Java 1.4までのコードを記述するだけで済みます。Java5以降では、keytoolとopensslを組み合わせて、JKS-> PKCS#12-> PEMから2段階の変換を実行できます。ただし、JKS-> PEMから直接変換を実行するには、独自の鍵ツールを作成することが唯一の方法です。
Stobor

JDK 6以降だと思います。しかし、はい、PKCS#12インポートがサポートされるようになりました。
エリクソン、

13

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

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

10
はい、証明書をエクスポートします。ただし、主要な情報はエクスポートされません...
Stobor

これは、私が何十ものdocページで検索していたものに対する単純な答えでkeytoolあり、jboss成功しませんでした。ありがとう!
kratenko

15
これは非公開の重要な情報をエクスポートしません
James

1
これは、公開鍵証明書をエクスポートします
asami

このコマンドを実行してみました。パスワードが必要です。キーストアのパスワードを入力してください:keytoolエラー:java.io.IOException:キーストアが改ざんされたか、パスワードが正しくありませんでした。私はパスワードas(password)を使用しましたが、同じエラーを投げていました
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 middle.p12 -srcstoretype JKS -deststoretype PKCS12

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

  1. openssl pkcs12 -in中間.p12 -nodes -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



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 -alias androidkey

キーストアのパスワードを入力してください:
新しいパスワードを再入力してください:
あなたの姓名は何ですか?不明: FirstName LastName
組織単位の名前は何ですか?不明: モバイル開発
組織の名前は何ですか?不明: あなたの会社名
あなたの市区町村の名前は何ですか?あなたの州または県の名前は何ですか?
このユニットの2文字の国コードは何ですか?不明:IN // Enterキーを押します

確認を求められます

CN = FirstName LastName、OU = Mobile Development、O = your company name、L = CityName、ST = StateName、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キーストアをPEM形式に変換する

すべての中で最も正確な答えは、これは不可能であることです。

Javaキーストアは暗号化キー証明書のストレージ機能にすぎませんが、PEMはX.509証明書のみのファイル形式です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.