使用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()
和getKey
方法与密码一起使用时,load()
方法将引发错误,但是当load()
与null
密码一起使用时, getKey
使用相同的密码,可以正常工作。
答案 0 :(得分:1)
JCEKS与JKS一样,使用商店级密码(仅)进行完整性检查;如果您调用.load(instream,null)
,则它不会检查完整性,但仍会加载内容-或尝试执行以下操作:如果数据实际上已被篡改或损坏,则加载可能会以多种方式失败,或者看起来可以成功,但是以后引起其他问题;但是,如果数据正确,则会加载。 (请注意,其他密钥库类型(例如PKCS11)不一定是正确的。)
JCEKS或JKS中的证书未加密,无需任何(更多)密码即可访问。私钥(如果有)经过单独的密码加密,要访问私钥,您需要提供正确的密钥级密码,该密码可以与商店密码相同或不同。通常,使密钥密码与商店密码相同时比较容易混淆,通常希望混淆程度较小,但这不是必需的。
您显然有一个JCEKS,其存储密码不同于您所知道的值,但包含一个密码与该值匹配的密钥。如果要更改此设置,请在.load(instream,null)
之后用.store(outstream,desiredpassword)
重新编写。