KeyStore.load无法工作,但使用相同密码的KeyStore.getkey可以工作

3
使用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(InputStream stream, char[] password) method with the correct password, it works fine. This error occurs when the keystore file has been modified or the password provided is incorrect.

InputStream keystoreStream = new FileInputStream(strKeystorePath); 
KeyStore keystore = KeyStore.getInstance("JCEKS"); 
keystore.load(keystoreStream, null); 
Key key = keystore.getKey(strAliasName, strTrustStorePwd.toCharArray());

软件运行正常,请确认loadgetKey方法使用相同的密码。

当使用密码调用load()getKey方法时,load()方法会抛出错误,但是当使用null密码调用load()方法,以及使用相同的密码调用getKey方法时,则可以正常运行。

1个回答

3

JCEKS和JKS一样,只使用存储级密码来保证整个存储的完整性;如果调用.load(instream,null),它不会检查完整性,但仍然加载内容--或尝试加载:如果数据实际上已被篡改或损坏,则加载可能以任何方式失败,或表面上成功但后续可能导致其他问题;但如果数据是正确的,它确实会加载。(请注意,其他密钥库类型(如PKCS11)不一定具有这种特性。)

无论是JCEKS还是JKS中的证书都是未加密的,可以在没有任何(进一步的)密码的情况下访问。私钥(如果有)是单独进行密码加密的,要访问私钥,您需要提供正确的密钥级密码,该密码可以与存储密码相同或不同。通常将密钥密码设置为与存储密码相同会更少混淆,而更少的混淆通常是可取的,但不是必需的。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接