2011-02-07 133 views
7

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

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是访问我通过密钥工具创建密钥库myPersonal.keystore的密码。其中有2个条目,用于证书,1个DSA和1个RSA。每个密钥都与密钥库(以及相互之间)有不同的密码。现在代码是正确的,因为如果我使用一个具有与密钥库相同密码的证书条目的密钥库,则没有例外,程序运行良好。

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

回答

7

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

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

+0

所以你说这是一个隐含的需求?是否有任何理由在KeyManagerFactory中强制实施此限制?我假设在真实场景中常见的情况是使用不同的密码 – Cratylus 2011-02-08 08:06:43