java密钥库和密码设置

我在java keystores和keytool上有以下问题。 我假设密钥库可能有多个证书。 正如我所尝试的那样,通过keytool,我可以创建一个密钥库,并且要访问这个密钥库,我必须设置密码。 另外,要访问每个证书条目,我必须设置密码。 是否必须为密钥库和条目使用相同的密码? 如果不是(我认为这是合理的假设)为什么以下代码:

char[] pwd = new char[]{'s','e','c','r','e','t'}; KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(new FileInputStream("myPersonal.keystore"), pwd); kmf.init(ks, pwd);//fails here with exception 

给我以下例外?

 Exception in thread "main" java.security.UnrecoverableKeyException: Cannot recover key at sun.security.provider.KeyProtector.recover(Unknown Source) at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source) at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source) at java.security.KeyStore.getKey(Unknown Source) 

secret是访问我通过keytool创建的密钥库myPersonal.keystore的密码。 其中有2个条目,用于证书,1个DSA和1个RSA。 每个密码库都有不同的密码(和彼此)。 现在代码是正确的,因为如果我使用一个密钥库,其中一个证书条目具有与密钥库相同的密码,则没有exception,程序运行正常。

那么这里的问题是什么? 我不应该有不同的密码? 我不应该有很多证书? 或者是什么?

根据API的规定,KeyManagerFactory.init方法接受用于从密钥库中检索密钥的密​​码。 由于只有一个密码参数,因此期望所有密钥的密码相同。 如果其中一个密钥使用了不同的密码,那么您将看到由于该特定密钥库条目的密码不正确而看到的错误。

最简单的解决方案是对密钥库中的所有条目使用相同的密码。 如果您设置为每个条目维护不同的密码,那么您可能需要考虑构建自己的自定义安全元素,例如KeyManager。