我发现当我创建一个密码保护的PKCS12文件时,它还包含受密码保护的私钥及其关联的公钥/证书,我能够解密私钥,无论提供给getKey()
(内部加密内容)的密码如何,只要为KeyStore
的初始load()
提供了正确的密码即可。这是一个已知问题还是有其他人看到这个?它看起来好像私钥密码未被使用或者一起被忽略。我使用Android和BouncyCastle作为提供者。我也很好奇这个问题对于JKS来说是否属实,而不仅仅是BouncyCastle?为清楚起见,在下面的代码中检查错误已被删除。KeyStore没有在BouncyCastle中应用/强制安装PKCS12文件的私钥密码
当我创建我的PKCS12文件我用下面的代码(privateKey
是RSAPrivateKey
和signedCert
是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();
在此先感谢!
谢谢!我使用BC 1.47。关于您的评论,您是否认为1.49版可以解决与PKCS12包属性相关的以下问题? [在Android中使用BouncyCastle PKCS12SafeBagBuilder或PKCS12BagAttributeCarrier更改PKCS12安全包属性?](http://stackoverflow.com/questions/12890436/use-bouncycastle-pkcs12safebagbuilder-or-pkcs12bagattributecarrier-to-change-pkc) – aspergillusOryzae 2013-03-11 21:32:10
是的。我已经添加了一个解决这个问题的答案,但简短的答案是org.bouncycastle.pkcs包提供了处理这些问题的最一般方法。 – 2013-03-12 23:23:13