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

标签 java applet

在 Internet Explorer 中使用 Java 8 更新 162 及更早版本时,小程序会按预期加载并运行。删除 Java 8 更新 162 并安装 Java 8 更新 171 或 172 时,小程序会出现引用 code attribute of the applet tag 中列出的类并出现 ClassNotFoundException 错误。 。我在 171 中没有看到任何原因。或172发行说明或 171172 bug修复。我使用的是 Windows 10 专业版 1709 内部版本 16299.371。该小程序使用受信任且仍然有效的证书进行签名。异常站点列表中没有任何异常,并且为此站点添加异常(在 Java 8u162 上没有异常时工作正常)仍然显示异常。使用 Java 8 更新 162 及更早版本仍然可以在另一台 PC 上运行。

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

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

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

更新 2:我还知道 3DES 密码套件在 171 和 172 的更新中已被禁用,但当前的摘要算法是 SHA-256,签名算法是 SHA256withRSA 2048 位 key ,与签名证书的签名算法和 key 匹配。我什至尝试使用 Java 8 Update 172 对小程序进行签名,而不更改 java.security 以删除 3DES_EDE_CBC,并且使用该版本 ClassNotFoundException 仍然按预期持续存在。

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

更新 4:在 Java 控制面板中启用调试选项会导致显示完整的堆栈跟踪,其中 CODE_ATTRIBUTE_VALUE 是我在 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

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

最佳答案

JAVA_HOME\lib\security\java.security

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

关于java - 适用于 Java 8 更新 162 及更早版本的小程序不适用于更新 171 和 172,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49918012/

相关文章:

java - 我们可以在 xml 中为 android 背景制作多色渐变吗?

java - JUnit测试divide()方法的正确方法

这个动画 Java 小程序背后的算法

java - 无法从 HTML 中的另一个目录加载 Java 小程序

java - JMenu 栏项目(退出)不起作用

java - getTextContent() 和 item(0) 在 Java DOM API 中返回什么?

java - List 对象是否通过引用传递?

java - 如何制作 Javafx 图像裁剪应用

java - 如何在Java小程序中使用图标?

java - JavaCard 中的大值计算