使用 Oracle Java 8 JRE 172 打开 JCEKS 密钥存储时出现“java.io.IOException: Invalid secret key format”

wil*_*ilx 5 java osgi jce equinox jceks

当我尝试在 Windows 上使用 Oracle Java 8 JRE 172 打开 JCEKS 类型密钥存储时出现以下异常。这适用于早期版本的 JRE:

INFO: ObjectInputFilter REJECTED: null, array length: -1, nRefs: 1, depth: 1, bytes: 70, ex: n/a
[...call stacks omitted to protect the innocent...]
Caused by: java.io.IOException: Invalid secret key format
        at com.sun.crypto.provider.JceKeyStore.engineLoad(JceKeyStore.java:856)
        at java.security.KeyStore.load(Unknown Source)
[...]
Run Code Online (Sandbox Code Playgroud)

这看起来非常像JDK-8202506,但我使用 Java 8 并且我收到null了初始 INFO 消息。

这是同样的问题吗?

在我看来,JDK-8202506问题目前尚未在任何公共 JRE 版本中修复。我对吗?

更新 1

这看起来很相似,他们也没有解决方案:ATLAS-2642

更新 2

出于某种原因,Equinoxcom.sun.crypto.provider.SealedObjectForKeyProtector在升级后看不到该类,即使它在新 JDK 附带的 JRE 中很明显:

BundleClassLoader[foo.bar.baz.crypto].loadClass(com.sun.crypto.provider.SealedObjectForKeyProtector) failed.
java.lang.ClassNotFoundException: com.sun.crypto.provider.SealedObjectForKeyProtector
    at org.eclipse.osgi.framework.internal.core.BundleLoader.findClassInternal(BundleLoader.java:481)
    at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:397)
    at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:385)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:87)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:686)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1866)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1749)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2040)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
    at com.sun.crypto.provider.JceKeyStore.engineLoad(JceKeyStore.java:850)
    at java.security.KeyStore.load(KeyStore.java:1445)
Run Code Online (Sandbox Code Playgroud)

更新 3

该类SealedObjectForKeyProtector.classsunjce_provider.jar. 当我们尝试用 JD-GUI 反编译它时,它会因内部错误而失败,这与其他类不同:

JD-GUI 无法反编译 SealedObjectForKeyProtector.class

Rob*_*ang 1

我目前正在与 Oracle JRE 支持人员合作解决此问题,并已打开一个私人错误。目前我得到的信息:

  1. 它与 JDK-8202506 不同。
  2. 是的,这是带有 Equinox 的 SealedObjectForKeyProtector 上的类加载问题。

解决方案:

解决方法是将以下行添加到 OSGi 包 MANIFEST.MF 中。

Eclipse-BuddyPolicy:ext

我亲自使用 JRE 1.8_181 验证了此解决方法,它似乎有效。

我还被告知,对于 Java 9,JVM 参数 -Dosgi.compatibility.bootdelegation=true 可以完成这项工作(不需要更新 MANIFEST.MF),但我没有 Java 9 环境来验证它。如果有人可以尝试并让我们知道结果,我们将不胜感激。