java keystore 和密码设置

标签 java security ssl digital-certificate keytool

我有以下关于 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/

相关文章:

ssl - 使用扭曲的网络服务器基于客户端证书访问特定资源

python-3.x - "Getting SSLError while trying to ' 获取 ' content using ' 请求 ' from a ' HTTPS ' url"

java - 如何通过构建的 jar 正确放置和使用项目资源?

c# - 使用 C# 获取服务器和映射驱动器的 ACL 列表

java - FileReader 无法找到文件,即使它位于工作目录中

web-hosting - 网站默认文档被安全限制拒绝?

vue.js - vue-CLI 输出非常令人担忧的错误(安全问题)

c# - ActiveMQ、SSL、C#

java - 余弦定理用来求第三边 - 为什么我得到错误的结果?

java - 使用 BufferedReader 读取资源