gpt4 book ai didi

java - 使用 Oracle Java 8 JRE 172 打开 JCEKS keystore 时出现 "java.io.IOException: Invalid secret key format"

转载 作者:搜寻专家 更新时间:2023-11-01 02:00:14 25 4
gpt4 key购买 nike

当我尝试在 Windows 上使用 Oracle Java 8 JRE 172 打开 JCEKS 类型 keystore 时出现以下异常。这适用于早期版本的 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,并且在初始 INFO 消息中得到 null

这是同一个问题吗?

在我看来JDK-8202506问题目前未在任何公共(public) JRE 版本中修复。我说得对吗?

更新 1

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

更新 2

由于某种原因,Equinox 在升级后无法看到 com.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 反编译它时,它因内部错误而失败,这与其他类不同:

JD-GUI failure to decompile SealedObjectForKeyProtector.class

最佳答案

我最近遇到了这个问题。根据我的排查,这是由于此方法的返回值不同造成的:

sun.misc.VM.latestUserDefinedLoader()

以前(8u171 之前),此方法返回 sun.misc.Launcher$ExtClassLoader,而它在升级后返回应用程序的类加载器。在 ObjectInputStream 中,两个类加载器都可以成功加载 com.sun.crypto.provider.SealedObjectForKeyProtector,这是因为 ExtClassLoader 是应用程序类加载器的父级(或父级的父级)。然而,一旦 SealedObjectForKeyProtector 被应用程序的类加载器加载,它的类加载器就不再等同于 ExtClassLoader。

另一方面,在 com.sun.crypto.provider.JceKeyStore 中,与 ObjectInputStream 不同,SealedObjectForKeyProtector 始终由 ExtClassLoader 加载。因此在下面 checkin JceKeyStore.java:932将因类不相等而失败:

932            if (info.serialClass() != SealedObjectForKeyProtector.class))
934 return Status.REJECTED;

然后,我们将得到下面的日志和最终的 IOException:ObjectInputFilter 已拒绝:类 com.sun.crypto.provider.SealedObjectForKeyProtector

解决方案:确保类 com.sun.crypto.provider.SealedObjectForKeyProtector 未通过特定配置由 ContextClassLoader 加载。详细信息取决于 ContextClassLoader。例如对于org.powermock.core.classloader.MockClassLoader,具体的解决方案是在涉及的测试类中添加如下注解:

@PowerMockIgnore("com.sun.*")

关于java - 使用 Oracle Java 8 JRE 172 打开 JCEKS keystore 时出现 "java.io.IOException: Invalid secret key format",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50393533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com