使用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: Keystore被篡改了,或者密码不正确。
但是什么时候:使用
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使用相同的密码时,它就工作了。
发布于 2019-05-15 10:04:15
JCEKS和JKS一样,使用存储级密码(仅用于完整性检查) --检查整个存储;如果调用.load(instream,null),它不检查完整性,但仍然加载内容--或者尝试:如果数据实际上已被篡改或损坏,负载可能会以多种方式失败,或者看起来会失败,但随后会导致其他问题;但是如果数据是正确的,它就会加载。(注意,这并不一定适用于其他密钥库类型,如PKCS11)。
JCEKS或JKS中的证书都是未加密的,无需任何(进一步的)密码即可访问。私钥(如果有的话)是单独加密的,对于访问私钥,您需要提供正确的密钥级密码,这可以是相同的存储密码,也可以是不同的。使密钥密码与存储密码相同通常较不容易混淆,而较少的混淆通常是可取的,但并不是必需的。
显然,您有一个JCEKS,其存储密码与您所知道的值不同,但包含一个密码与该值匹配的密钥。如果您想改变这一点,在.load(instream,null)用.store(outstream,desiredpassword)重写它之后。
https://stackoverflow.com/questions/56144337
复制相似问题