我有一个JCEKS密钥库来保存我的AES密钥。 这已经在开发环境和GAE运行时工作了一段时间。
昨晚我部署了一个更新(与加密案件无关),现在加载密钥库会引发IOException: com.sun.crypto.provider.SealedObjectForKeyProtector ,随后我的加密工作都没有(正如你所期望的那样,我无法找到钥匙)。
我用Google搜索了一个例外 - 一位领导看起来很有希望: Convert a key of JCEKS of a provider into another store for another provider ...这表明用一个提供商创建的密钥箱无法与其他提供商一起阅读,但这似乎并非如此,因为它在昨天正在运行!另外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月20日更新 - 确定根本原因
问题是由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)
Google搜索类名已找到源(可能不是实际的源,但堆栈跟踪中的行号对齐)。第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无法加载密钥库,因为它无法加载类com.sun.crypto.provider.SealedObjectForKeyProtector,Google承认这是一个白名单问题。
临时解决方案 作为支持票的结果,谷歌已将我的运行时恢复到1.9.20,这没有这个问题。我正在等待一个允许我重新开始自动引擎更新的修复程序。
更新04/06/15 - 已解决 谷歌将在v1.9.22运行时进行修复。
更新11/06/15 - 毕竟没有解决 问题在v1.9.22运行时中持续存在:(
更新30/06/15 - 真的已经解决了&证明 谷歌在v1.9.23运行时修复了它。答案已更新以反映。
答案 0 :(得分:1)
这已在GAE运行时1.9.23中确认(不是1.9.22 - 它错过了削减)。
问题在于运行时白名单,它省略了加载JCEKS密钥库所需的一个或多个类。
此问题仅影响GAE运行时1.9.21& 22年9月1日。请注意,这是服务器引擎版本,而不是SDK版本。您可以在控制台中检查服务器版本。