我发现当我创建一个受密码保护的 PKCS12 文件时,该文件还包含受密码保护的私钥及其关联的公钥/证书,无论提供给getKey()
(内部加密内容)的密码如何,我都可以解密私钥只要提供正确的密码给KeyStore
's initial load()
。这是一个已知问题还是有其他人看到过这个?看起来私钥密码确实没有被使用或一起被忽略。我正在使用带有 BouncyCastle 作为提供程序的 Android。我也很好奇这个问题是否适用于 JKS 而不仅仅是 BouncyCastle?为清楚起见,已删除以下代码中的错误检查。
当我创建我的 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内容时,无论我为私钥密码输入什么,提取的私钥都正确加载并且都相同(pkey1 == pkey2 == pkey3用.equals()测试)。
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();
提前致谢!