使用 Java 8 更新 162 及更早版本的小程序不适用于更新 171 和 172

Applet working with Java 8 update 162 and older doesn't work with update 171 and 172

在 Internet Explorer 中使用 Java 8 update 162 及更早版本时,小程序会按预期加载和工作。删除 Java 8 更新 162 并安装 Java 8 更新 171 或 172 时,小程序错误 ClassNotFoundException 引用 code attribute of the applet tag. I don't see any reason for this in the 171 or 172 release notes or the 171 or 172 错误修复中列出的 class。我使用的是 Windows 10 Pro version 1709 build 16299.371。该小程序使用受信任且仍然有效的证书签名。异常站点列表中没有任何异常,为此站点添加异常(在 Java 8u162 上没有一个它工作正常)仍然显示异常。使用 Java 8 update 162 及更早版本仍在另一台电脑上工作。

在 Java 配置中清除应用程序缓存时,小程序的 JAR 文件不会再次出现在缓存中。

您是否知道 Java 8u171 或 172 中影响小程序的任何更改?您对解决这个问题有什么建议吗?

更新 1:我知道小程序在 Java 9 中已被弃用,小程序在 Firefox 和 Chrome 中不起作用,但是这是在 Internet Explorer 中。

更新 2: 我也知道 3DES 密码套件在更新到 171 和 172 时已被禁用,但当前的摘要算法是 SHA-256 和签名算法为 SHA256withRSA,密钥长度为 2048 位,与签名证书的签名算法和密钥匹配。我什至尝试使用 Java 8 更新 172 签署小程序而不更改 java.security 以删除 3DES_EDE_CBC 并使用该版本 ClassNotFoundException 仍然如预期的那样存在。

更新 3:当使用 Fiddler 4 or Charles 作为 Internet Explorer 的代理并捕获服务器和浏览器之间的流量时,小程序加载并按预期工作。 Java SE 运行时环境 8 更新 172Java 插件 11.172.2 附加组件已设置在所有网站上允许。当我使用 Java 控制面板中的 Java 缓存查看器从资源缓存中清除小程序时,如果没有代理,小程序不会再次下载到缓存中,但是如果我再次使用代理它确实下载到缓存中。我的猜测是代理流量被视为本地流量,因此具有不同的权限。任何其他想法或它可能是什么权限?

更新 4:在 Java 控制面板中启用调试选项会导致显示完整的堆栈跟踪,其中 CODE_ATTRIBUTE_VALUE 是我设置的值在小程序标签的代码属性上。小程序的 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.access0(Unknown Source)
  at com.sun.deploy.security.DeployURLClassPath$JarLoader.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.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.run(Unknown Source)
  at sun.plugin2.applet.Plugin2ClassLoader.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

目前小程序托管在 Windows Server 2003 上,使用 IIS。将它移动到 Windows Server 2008 也使用 IIS 会导致该问题消失。 Laitinen 先生是对的,TLS 连接使用的是 3DES_EDE_CBC.

JAVA_HOME\lib\security\java.安全

更新 171 将 3DES_EDE_CBC 添加到禁用算法列表 (jdk.tls.disabledAlgorithms)。删除它,您的小程序将再次运行。

遇到了同样的问题,归结为更新 171 不再支持 TLS 1.0。

我们的网络服务器很旧,只支持 TLS 1.0,因此小程序下载失败,这可以在 Java 控制台中看到,连接已关闭。

升级了网络服务器以支持 TLS 1.2,一切都恢复正常了。