web-dev-qa-db-ja.com

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

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

キーストアを直接PEMに変換する代わりに、まずPKCS12ファイルを作成してから、関連するPEMファイルとキーストアに変換しようとしました。しかし、それらを使用して接続を確立できませんでした。 (セキュリティで保護された接続を実装するには、PEMファイルとキーストアファイルだけが必要です。「Javaキーストアファイルから開始」のような制限はありません。)場合)

ただし、jksからpemへの直接変換方法が望ましいです。

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

 bash $ keytool -keystore foo.jks -genkeypair -alias foo\
 -dname 'CN = foo.example.com、L = Melbourne、ST = Victoria、C = AU' 
キーストアパスワードの入力:
新しいパスワードの再入力:
 
のキーパスワードの入力(キーストアパスワードと同じ場合に戻る):
 bash $ keytool -keystore foo.jks -exportcert -alias foo |\
 openssl x509 -inform der -text 
キーストアパスワードを入力:asdasd 
証明書:
データ:
バージョン:3(0x2)
シリアル番号:1237334757(0x49c03ae5)
署名アルゴリズム:dsaWithSHA1 
発行者:C = AU、ST = Victoria、L = Melbourne、CN = foo.example.com 
有効性
更新前:3月18日00:05:57 2009 GMT 
更新後:6月16日00:05:57 2009 GMT 
件名:C = AU、ST = Victoria、 L =メルボルン、CN = foo.example.com 
件名公開鍵情報:
公開鍵アルゴリズム:dsaEncryption 
 DSA公開鍵:
 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 
宛先キーストアパスワードの入力:
新しいパスワードの再入力:
ソースキーストアパスワードの入力:
エイリアス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 = Victoria、L = Melbourne、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公開鍵:
 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 
 PEMパスフレーズを入力:
秘密鍵:(1024ビット)
 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-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
205
Stobor

StoBorのコマンドを使用すると、opensslからエラーが発生し続けました。

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を設定していましたが、引数の値は重要ではありませんでした。

29
cmcginty

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
13
erickson

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

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

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>
7
asami

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

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

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

2
Marco Luly

さて、 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
Charlie Martin

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"は不要なものをすべて除外します。キーストア内のすべてのPEMのみが残っています。
  3. >> "myKeystore.pem" PEMをファイル「myKeyStore.pem」に書き込みます。
1
Mark Lagendijk

Opensslをインストールしておらず、簡単な解決策を探している場合、 portcle と呼ばれるソフトウェアがあります。これは非常に便利で、ダウンロードするのが簡単です。

欠点は、私の知る限りコマンドラインがないことです。しかし、GUIから、PEM秘密鍵をエクスポートするのは非常に簡単です。

  1. JKSキーストアを開きます
  2. 秘密鍵エントリを右クリックして、エクスポートを選択します
  3. 秘密鍵と証明書およびPEM形式を選択します

    Export PEM private key from JKS with Portcle

1
Marcio Jasinski

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

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

Javaキーストアは、暗号化キーの保管施設にすぎませんand証明書ですが、PEMはX.509証明書のみのファイル形式です。

0
whaefelinger

最初にキーストアをJKSから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形式にする必要があります。それらを分割します。 「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

0
nkalra0123

最初にキーストアファイルを作成します

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

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

これで確認を求められます

CN = FirstName LastName、OU = Mobile Development、O =あなたの会社名、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
Ankit Dubey

Keystore Explorerをお試しください http://keystore-Explorer.org/

KeyStore Explorerは、Javaコマンドラインユーティリティkeytoolおよびjarsignerに代わるオープンソースGUIです。 openssl/pkcs12も同様です。

0
Johnnyboy