JavaキーストアをPEM形式に変換する
-
19-08-2019 - |
質問
keytoolおよびopensslアプリケーションを使用して、JavaキーストアファイルからPEMファイルに変換しようとしています。しかし、変換を行う良い方法を見つけることができませんでした。何か案は?
キーストアを直接PEMに変換する代わりに、まずPKCS12ファイルを作成してから、関連するPEMファイルとキーストアに変換しようとしました。しかし、それらを使用して接続を確立できませんでした。 (セキュリティで保護された接続を実装するには、PEMファイルとキーストアファイルだけが必要です。<!> quot; Javaキーストアファイル<!> quot;から開始するような制限はありません。:)私の場合)
しかし、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-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
他のヒント
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
を設定していましたが、引数の値は重要ではありませんでした。
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
キーツールを使用したjksからpemファイルへの直接変換
keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
JKSファイルをPEMおよびKEY形式(.crt <!> amp; .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
次に、公開キーと秘密キーのペアを2つのファイルprivate.key publi.pemに分割しました。
さて、#12ファイルから OpenSSLが便利に行う必要があります:
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"
説明:
-
keytool -list -rfc -keystore "myKeystore.jks"
は、 'myKeyStore.jks' KeyStoreのすべてをPEM形式でリストします。ただし、追加情報も出力されます。 -
| sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"
は、不要なものをすべて除外します。キーストア内のすべてのPEMのみが残っています。 -
>> "myKeystore.pem"
PEMをファイル「myKeyStore.pem」に書き込みます。
opensslをインストールしておらず、簡単な解決策を探している場合、 portcle これは非常に便利で、ダウンロードするのに小さいです。
欠点は、私の知る限りコマンドラインがないことです。 しかし、GUIから、PEM秘密鍵をエクスポートするのは非常に簡単です:
キーストアエクスプローラーを試す http://keystore-explorer.org/
KeyStore Explorerは、Javaコマンドラインユーティリティのkeytoolおよびjarsignerに代わるオープンソースGUIです。 openssl / pkcs12も同様です。
最初にキーストアファイルを作成
C:\ Program Files \ Android \ Android Studio \ jre \ bin <!> gt; keytool -keystore androidkey.jks -genkeypair -alias androidkey
キーストアのパスワードを入力:
新しいパスワードを再入力:
あなたの名と姓は何ですか?
不明:名、姓
組織単位の名前は何ですか?
不明:モバイル開発
あなたの組織の名前は何ですか?
不明:会社名
あなたの市または地域の名前は何ですか?
州または県の名前は何ですか?
このユニットの2文字の国コードは何ですか?
不明:IN // Enter
今、確認を求められます
CN = FirstName LastName、OU = Mobile Development、O =あなたの会社名、L = CityName、ST = StateName、C = INは正しいですか? [いいえ]:はい
のキーパスワードを入力 (キーストアのパスワードと同じ場合に戻る):同じパスワードが必要な場合はEnterキーを押します
キーが生成されました。次のコマンドを使用して単純にpemファイルを取得できます
C:\ Program Files \ Android \ Android Studio \ jre \ bin <!> gt; keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
キーストアのパスワードを入力:
ファイルに保存された証明書
最初にJKSからPKCS12にキーストアをダンプします
1。 keytool -importkeystore -srckeystore〜/ .android / debug.keystore -destkeystore Intermediate.p12 -srcstoretype JKS -deststoretype PKCS12
新しいpkcs12ファイルをpemにダンプします
- openssl pkcs12 -in Intermediate.p12 -nodes -out Intermediate.rsa.pem
証明書と秘密キーの両方がpem形式である必要があります。それらを分割します。 <!>#8220; BEGIN CERTIFICATE <!>#8221;の間に部品を置きます。および<!>#8220; END CERTIFICATE <!>#8221; cert.x509.pemに <!>#8220; BEGIN RSA PRIVATE KEY <!>#8221;の間にパーツを置きます。および<!>#8220; END RSA PRIVATE KEY <!>#8221; private.rsa.pemへ signapkが期待するように秘密鍵をpk8形式に変換します
3。 openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt
JavaキーストアをPEM形式に変換する
すべての最も正確な答えは、これは不可能だということです。
Javaキーストアは暗号化キーおよび証明書の単なる保管施設であり、PEMはX.509証明書のみのファイル形式です。