首页 > 解决方案 > 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());

它工作正常。请注意loadgetKey方法使用相同的密码。

load()andgetKey方法与 password 一起使用时,该load()方法会抛出错误,但当load()nullpassword 和getKey相同的密码一起使用时,它正在工作。

标签: javakeystorekeytool

解决方案


JCEKS 与 JKS 一样,使用商店级密码(仅)对整个商店进行完整性检查;如果您调用.load(instream,null)它不会检查完整性但仍会加载内容 - 或尝试: 如果数据实际上已被篡改或损坏,则加载可能会以多种方式失败,或者看似成功但稍后会导致其他问题;但如果数据正确,它会加载。(请注意,这不一定适用于其他密钥库类型,例如 PKCS11。)

JCEKS 或 JKS 中的证书未加密,无需任何(更多)密码即可访问。私钥(如果有)是单独密码加密的,要访问私钥,您需要提供正确的密钥级密码,该密码可以与存储密码相同或不同。使密钥密码与存储密码相同通常不太容易混淆,通常希望减少混淆,但这不是必需的。

您显然有一个 JCEKS,其存储密码与您知道的值不同,但包含一个密码与该值匹配的密钥。如果您想更改它,请在.load(instream,null)重新编写后使用.store(outstream,desiredpassword).


推荐阅读