java - JCEKS keystore 不再加载 : com. sun.crypto.provider.SealedObjectForKeyProtector

标签 java google-app-engine aes keystore

我有一个 JCEKS keystore 来保存我的 AES key 。 这已经在开发环境和 GAE 运行时中工作了一段时间。

昨晚我部署了一个更新(与加密案例无关),现在加载 keystore 抛出 IOException:com.sun.crypto.provider.SealedObjectForKeyProtector 随后我的加密都不起作用(正如您所期望的,因为我无法拿到 key )。

我用 Google 搜索了异常(exception)情况 - 一条线索看起来很有希望: Convert a key of JCEKS of a provider into another store for another provider ...这表明不能用另一个提供者读取由一个提供者创建的 keystore ,但这里似乎不是这种情况,因为它昨天还在工作!还有 https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.2/html/Administration_and_Configuration_Guide/sect-Password_Vaults_for_Sensitive_Strings.html建议不兼容的提供者。

我将我的应用程序回滚到以前的(工作)版本,但我遇到了同样的错误。

GAE 是否已更改其默认提供程序?我应该在我的代码中明确声明所需的提供程序吗?

谢谢 史蒂夫

2015 年 5 月更新 - 已确定根本原因

问题是下面的 ks.load() 抛出的 IOException:

final KeyStore ks = KeyStore.getInstance(KEYSTORE_TYPE_JCEKS);
try {
    InputStream is = this.getClass().getClassLoader().getResourceAsStream("squirrol.keystore");
    ks.load(is, getKeystorePassword().toCharArray()); // IOException thrown here
    ...
} catch (NoSuchAlgorithmException | CertificateException | IOException e) {
    StringWriter sw = new StringWriter();
    e.printStackTrace(new PrintWriter(sw));
    throw new KeyStoreException("Failed to load KeyStore: " + e.getLocalizedMessage());
}

堆栈跟踪输出开始于:

at com.sun.crypto.provider.JceKeyStore.engineLoad(JceKeyStore.java:844)

谷歌搜索类名找到了来源(可能不是实际来源,但堆栈跟踪中的行号对齐)。第 844 行表明此 IOException 是由于 ClassNotFoundException 引发的,消息是未找到的类的名称 - 在本例中为 com.sun.crypto.provider.SealedObjectForKeyProtector:

http://www.docjar.com/html/api/com/sun/crypto/provider/JceKeyStore.java.html

因此,根本原因是 Google App Engine 运行时 v1.9.21 无法加载 keystore ,因为它无法加载 com.sun.crypto.provider.SealedObjectForKeyProtector 类,Google 承认这是一个白名单问题。

临时解决 作为支持票的结果,谷歌已将我的运行时恢复到 1.9.20,它没有这个问题。我正在等待一个修复程序,它可以让我重新使用自动引擎更新。

更新 04/06/15 - 已解决 Google 将在 v1.9.22 运行时中进行修复。

更新 11/06/15 - 毕竟没有解决 该问题在 v1.9.22 运行时仍然存在:(

2015 年 6 月 30 日更新 - 真正解决并证明 Google 在 v1.9.23 运行时修复了它。答案已更新以反射(reflect)。

最佳答案

这已在 GAE 运行时 1.9.23 中得到确认(不是 1.9.22 - 它错过了剪辑)。

问题在于运行时白名单,它省略了加载 JCEKS keystore 所需的一个或多个类。

此问题仅影响 GAE 运行时 1.9.21 和 1.9.22。请注意,这是服务器引擎版本,而不是 SDK 版本。可以在控制台查看服务器版本。

关于java - JCEKS keystore 不再加载 : com. sun.crypto.provider.SealedObjectForKeyProtector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30259466/

相关文章:

java - 在 weblogic 上部署 Ear 时出现 classNotFound 异常

database - Google App Engine 上的无向图和遍历

java - 添加字段以筛选 : a boolean OR for Google App Engine?

java - 如果我们用 AES key 包装 256 位 AES key ,那么包装 key 的大小可以超过 32 字节?

java - 使用java进行AES解密

java - 在另一个类中使用来自扩展类的局部变量字符串

java - 一旦 Android 应用程序检测到特定的 Wi-Fi 网络,就会触发一些代码

java - 用字符串分割字节数组?

python - 在 yaml 文件中为谷歌应用引擎设置 url(找不到页面)问题

.net - 使用 CCKeyDerivationPBKDF 获取派生 key