パスワードで保護された秘密鍵とそれに関連付けられた公開鍵/証明書も含むパスワードで保護された PKCS12 ファイルを作成すると、getKey()
(内部の暗号化されたコンテンツ) に提供されたパスワードに関係なく、秘密鍵を復号化できることがわかりました。KeyStore
のイニシャルに正しいパスワードが提供されている限りload()
。これは既知の問題ですか、それとも他の誰かがこれを見たことがありますか? 秘密鍵のパスワードが使用されていないか、まったく無視されているようです。BouncyCastle をプロバイダーとして Android を使用しています。この問題が BouncyCastle だけでなく、JKS にも当てはまるかどうかも知りたいです。以下のコードのエラー チェックは、わかりやすくするために削除されています。
PKCS12 ファイルを作成するときは、次のコードを使用します ( privateKey
is anRSAPrivateKey
およびsignedCert
is an X509Certificate
):
KeyStore store;
store = KeyStore.getInstance( "PKCS12", "BC" );
store.load( null, null );
X509Certificate[] chain = new X509Certificate[1];
chain[0] = signedCert;
store.setKeyEntry( pkcs12Alias, privateKey, p12PkeyPass.toCharArray(), chain );
FileOutputStream fos;
File outputDir = appContext.getFilesDir();
File pkcs12File = new File( outputDir, p12Filename );
fos = new FileOutputStream( pkcs12File );
store.store( fos, p12Pass.toCharArray() );
fos.flush();
fos.close();
PKCS12 の内容を読み込もうとすると、秘密鍵のパスワードに何を入力しても、抽出された秘密鍵はすべて正しく読み込まれ、すべて同じです (.equals() でテストされた pkey1 == pkey2 == pkey3)。
FileInputStream fis;
KeyStore store;
File pkcs12File = new File( activity.getFilesDir(), p12Filename );
fis = new FileInputStream( pkcs12File );
store = KeyStore.getInstance( "PKCS12", "BC" );
store.load( fis, p12Pass.toCharArray() );
X509Certificate signedCert = (X509Certificate) store.getCertificate( pkcs12Alias );
// try to get the private key with different passwords - result is the same
RSAPrivateKey pkey1 = (RSAPrivateKey) store.getKey( pkcs12Alias, p12PkeyPass.toCharArray() );
RSAPrivateKey pkey2 = (RSAPrivateKey) store.getKey( pkcs12Alias, "".toCharArray() );
RSAPrivateKey pkey3 = (RSAPrivateKey) store.getKey( pkcs12Alias, "something completely different".toCharArray() );
fis.close();
前もって感謝します!