java - KeyStore.load 不起作用,但 KeyStore.getkey 使用相同的密码
问题描述
使用 java Keystore 类。
InputStream keystoreStream = new FileInputStream(strKeystorePath);
KeyStore keystore = KeyStore.getInstance("JCEKS");
keystore.load(keystoreStream, strTrustStorePwd.toCharArray());
Key key = keystore.getKey(strAliasName, strTrustStorePwd.toCharArray());
该load()
方法抛出keytool错误:
java.io.IOException:密钥库被篡改,或密码不正确。
但是当:使用
InputStream keystoreStream = new FileInputStream(strKeystorePath);
KeyStore keystore = KeyStore.getInstance("JCEKS");
keystore.load(keystoreStream, null);
Key key = keystore.getKey(strAliasName, strTrustStorePwd.toCharArray());
它工作正常。请注意load
和getKey
方法使用相同的密码。
当load()
andgetKey
方法与 password 一起使用时,该load()
方法会抛出错误,但当load()
与null
password 和getKey
相同的密码一起使用时,它正在工作。
解决方案
JCEKS 与 JKS 一样,使用商店级密码(仅)对整个商店进行完整性检查;如果您调用.load(instream,null)
它不会检查完整性但仍会加载内容 - 或尝试: 如果数据实际上已被篡改或损坏,则加载可能会以多种方式失败,或者看似成功但稍后会导致其他问题;但如果数据正确,它会加载。(请注意,这不一定适用于其他密钥库类型,例如 PKCS11。)
JCEKS 或 JKS 中的证书未加密,无需任何(更多)密码即可访问。私钥(如果有)是单独密码加密的,要访问私钥,您需要提供正确的密钥级密码,该密码可以与存储密码相同或不同。使密钥密码与存储密码相同通常不太容易混淆,通常希望减少混淆,但这不是必需的。
您显然有一个 JCEKS,其存储密码与您知道的值不同,但包含一个密码与该值匹配的密钥。如果您想更改它,请在.load(instream,null)
重新编写后使用.store(outstream,desiredpassword)
.
推荐阅读
- javascript - 我无法从此 getElementbyId 获取数据
- git - 将 tarball 与 git 存储库匹配
- python - 从 youtube search api 过滤出实时视频
- rxjs - 我的 behaviorSubject 在 Angular 9 中加载页面时返回 null,它没有使用当前值更新
- angular - Angular - 在选项卡单击时重新加载选项卡
- mysql - 如何在节点 js 中访问查询函数之外的变量
- c# - C# 是否存在无效(脏)JSON 解析器?
- wcf - WCF 如何更改 X.509 证书私钥的加密提供程序
- android - 如何使用渲染操作在 React-native-Gifted-chat 中发送图像/视频和语音消息?
- python - 如何让我的 python discord bot 每 0.10 秒说一次相同的消息