KeyStore.load不起作用,但KeyStore.getkey使用相同的密码

时间:2019-05-15 08:03:46

标签: java keystore keytool

使用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()getKey方法与密码一起使用时,load()方法将引发错误,但是当load()null密码一起使用时, getKey使用相同的密码,可以正常工作。

1 个答案:

答案 0 :(得分:1)

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

JCEKS或JKS中的证书未加密,无需任何(更多)密码即可访问。私钥(如果有)经过单独的密码加密,要访问私钥,您需要提供正确的密钥级密码,该密码可以与商店密码相同或不同。通常,使密钥密码与商店密码相同时比较容易混淆,通常希望混淆程度较小,但这不是必需的。

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