使用Oracle Java 8 JRE打开JCEKS密钥库时出现“java.io.IOException:无效的密钥格式”172

使用Oracle Java 8 JRE打开JCEKS密钥库时出现“java.io.IOException:无效的密钥格式”172,第1张

概述当我尝试在 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 当我尝试在 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并且在初始INFO消息中得到null.

这是同一个问题吗?

在我看来,JDK-8202506问题目前尚未在任何公开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对其进行反编译时,与其他类不同,它会因内部错误而失败:

解决方法 这几天我遇到了这个问题.根据我的故障排除,它是由此方法的不同返回值引起的:

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加载.因此,下面检查JceKeyStore.java:932将因为等级不相等而失败:

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

然后,我们最终会得到以下日志和IOException:
ObjectinputFilter REJECTED:class com.sun.crypto.provIDer.SealedobjectForKeyProtector

解决方案:确保ContextClassLoader没有通过某些配置加载类com.sun.crypto.provIDer.SealedobjectForKeyProtector.细节取决于ContextClassLoader.例如,对于org.powermock.core.classloader.MockClassLoader,具体的解决方案是在下面的注释中添加相关的测试类:

@PowerMockIgnore( “的com.sun.*”)

总结

以上是内存溢出为你收集整理的使用Oracle Java 8 JRE打开JCEKS密钥库时出现“java.io.IOException:无效的密钥格式”172全部内容,希望文章能够帮你解决使用Oracle Java 8 JRE打开JCEKS密钥库时出现“java.io.IOException:无效的密钥格式”172所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1155747.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存