尝试使用密钥库中的别名读取密钥时发生 UnrecoverableKeyException

UnrecoverableKeyException on trying to read key using alias from keystore

我在 IBM Websphere 下面代码的第 4 行收到以下错误 自由配置文件 16.0.0

InputStream keystoreStream = EncryptionUtility.class.getResourceAsStream(keyStoreLocation);         
KeyStore keystore = KeyStore.getInstance("JCEKS");
keystore.load(keystoreStream, storePass.toCharArray());
Key key = keystore.getKey(alias, keyPass.toCharArray());

这会导致以下异常:

Caused by: java.security.UnrecoverableKeyException: com.ibm.crypto.provider.AESSecretKey
at com.sun.crypto.provider.KeyProtector.unseal(KeyProtector.java:358)
at com.sun.crypto.provider.JceKeyStore.engineGetKey(JceKeyStore.java:133)
at java.security.KeyStore.getKey(KeyStore.java:804)
at com.comdata.base.helper.EncryptionUtility.initSymmetricKey(EncryptionUtility.java:134)

知道为什么会这样吗?是否需要为密码配置任何内容?

我翻了一下JDK7中keyProtector.java的代码发现UnrecoverableKeyException是由ClassNotFoundException触发的 com.ibm.crypto.provider.AESSecretKey

我们需要通过 installUtility 安装任何功能吗?

Any ideas why this is happening? Is anything need to be configured for cryptography?

未找到 class (com.ibm.crypto.provider.AESSecretKey) 来自 IBM JDK。

看起来您的密钥库是使用 IBM JDK 创建的,因此其中打包了一个使用 IBM JDK 的 AESSecretKey 的密钥。

在运行时,您的 Liberty 服务器可能正在使用 non-IBM JDK,其中不会包含此 IBM JDK 特定的 class。

Do we need to install any feature via installUtility?

没有。缺少的 class 应该由 JDK 提供,而不是 Liberty 功能。