在Internet Explorer中使用Java 8更新162及更早版本时,applet会按预期加载并运行。删除Java 8更新162并安装Java 8更新171或172时,applet错误ClassNotFoundException
引用code attribute of the applet tag中列出的类。我在171或172发行说明或171或172错误修复程序中没有找到任何理由。我正在使用Windows 10 Pro版本1709 build 16299.371。 applet使用受信任且仍然有效的证书进行签名。在异常站点列表中没有任何异常,并且为此站点添加例外(它在Java 8u162上没有一个正常工作)仍然显示异常。使用Java 8更新162及更早版本仍在使用另一台PC。
在Java配置中清除应用程序缓存时,applet的JAR文件不会再次出现在缓存中。
您是否了解Java 8u171或172中任何影响applet的更改?您有什么建议可以解决这个问题吗?
更新1 :我知道在Java 9中不推荐使用applet,而且这些applet在Firefox和Chrome中不起作用,但这是在Internet Explorer中。
更新2 :我也知道3DES密码套件在171和172的更新中被禁用,但当前的摘要算法是SHA-256,签名算法是SHA256withRSA with一个2048位的密钥,它与签名证书的签名算法和密钥相匹配。我甚至尝试使用Java 8 Update 172签署applet而不改变java.security
以删除3DES_EDE_CBC并使用该版本ClassNotFoundException
仍然按预期保持。
更新3 :使用Fiddler 4或Charles作为Internet Explorer的代理并捕获服务器和浏览器之间的流量时,applet会按预期加载并运行。 Java SE Runtime Environment 8 Update 172 和 Java Plug-in 11.172.2 加载项都设置为允许在所有站点上。当我使用Java控制面板中的Java缓存查看器从资源缓存中清除applet时,applet不会在没有代理的情况下再次在缓存中下载,但如果我再次使用代理,则它会下载到缓存中。我的猜测是代理流量被视为本地流量,因此具有不同的权限。它可能有任何其他想法或权限吗?
更新4 :在Java控制面板中启用调试选项会显示完整堆栈跟踪,其中CODE_ATTRIBUTE_VALUE是我在applet标记的code属性上设置的值。即使我在存档属性中列出它,applet的JAR文件似乎也没有下载。
java.lang.ClassNotFoundException: CODE_ATTRIBUTE_VALUE
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Java控制台现在还显示了有关连接的更多详细信息,我看到以下原因:
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
at sun.plugin.PluginURLJarFileCallBack.connect(Unknown Source)
at sun.plugin.PluginURLJarFileCallBack.retrieve(Unknown Source)
at sun.net.www.protocol.jar.URLJarFile.retrieve(Unknown Source)
at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source)
at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source)
at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source)
at sun.plugin.net.protocol.jar.CachedJarURLConnection.connect(Unknown Source)
at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFileInternal(Unknown Source)
at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFile(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.getJarFile(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.access$900(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.ensureOpen(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.<init>(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(Unknown Source)
... 40 more
目前,applet使用IIS托管在Windows Server 2003上。使用IIS将其移至Windows Server 2008会导致该问题消失。 Laitinen先生是对的,TLS连接正在使用3DES_EDE_CBC。
答案 0 :(得分:3)
JAVA_HOME \ lib \ security中\ java.security
更新171将3DES_EDE_CBC添加到禁用的算法列表(jdk.tls.disabledAlgorithms)。删除它,你的小程序将再次工作。
答案 1 :(得分:1)
面对同样的问题,它归结为更新171不再支持TLS 1.0。
我们的网络服务器很旧,只支持TLS 1.0,因此Applet的下载失败了,这可以在Java控制台中看到,连接正在关闭。
升级网络服务器以支持TLS 1.2,它再次有效。