我有以下关于 Java keystore 和 key 工具的问题。我假设一个 keystore 可能有超过 1 个证书。正如我所尝试的那样,通过 keytool 我可以创建一个 keystore ,并且要访问这个 keystore 我必须设置一个密码。此外,要访问每个证书条目,我必须设置密码。 keystore 和条目是否必须具有相同的密码?如果不是(而且我认为这样假设是合理的)为什么是以下代码:
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 创建的 keystore myPersonal.keystore
的密码。其中有 2 个条目,用于证书,1 个 DSA 和 1 个 RSA。每个人都有不同的 keystore 密码(以及彼此)。现在代码是正确的,因为如果我使用具有与 keystore 相同密码的单个证书条目的 keystore ,则没有异常并且程序运行正常。
那么这里有什么问题呢?我不应该有不同的密码?我应该没有很多证书吧?或者什么?
最佳答案
如 API 所指定,KeyManagerFactory.init 方法接收用于从 keystore 检索 key 的密码。由于只有一个密码参数,因此期望所有 key 的密码都相同。如果其中一个 key 使用了不同的密码,那么您会看到您看到的错误,因为该特定 keystore 条目的密码不正确。
最简单的解决方案是对 keystore 中的所有条目使用相同的密码。如果您准备为每个条目维护不同的密码,那么您可能需要考虑构建您自己的自定义安全元素,例如 KeyManager。
关于java keystore 和密码设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4926290/