【问题标题】:KeyStore.load not working but KeyStore.getkey is working with same passwordKeyStore.load 不起作用,但 KeyStore.getkey 使用相同的密码
【发布时间】:2019-10-02 07:15:27
【问题描述】:

使用 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());

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

load()getKey 方法与密码一起使用时,load() 方法会抛出错误,但是当load()null 密码和getKey 使用相同的密码时,它正在工作.

【问题讨论】:

    标签: java keystore keytool


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 2021-04-18
      • 2014-11-19
      • 2015-09-03
      • 1970-01-01
      • 2020-01-08
      • 2015-02-25
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多