当我尝试在 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)
[...]
这看起来很像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)
更新 3
这个类SealedObjectForKeyProtector.class
在某种程度上不同于sunjce_provider.jar
. 当我们尝试使用 JD-GUI 对其进行反编译时,它会因内部错误而失败,这与其他类不同: