【问题标题】:Java 1.7.0u71 can't load an applet that 1.7.0u67 canJava 1.7.0u71 无法加载 1.7.0u67 可以加载的小程序
【发布时间】:2014-12-23 06:30:38
【问题描述】:

我有一个已签名的 Java 小程序,它在 v7u67 中加载非常好,但在 v7u71 中它不再加载。此外,尽管 JAR 和 <object> 标签非常相似,但在我位于本地机器上的测试服务器上的 v7u71 中,小程序仍然可以正常加载。在这两种情况下,网站都使用 HTTPS 访问(尽管测试服务器使用 HTTPS 的自签名证书)。

完整的跟踪/调试日志可在http://pastebin.com/7JNavVVq 获得,下面是悬崖笔记。

security: Expected Main URL: https://popcornmanager.com/manager/grid.1.2.8e.jar
basic: Plugin2ClassLoader.addURL parent called for https://popcornmanager.com/manager/grid.1.2.8e.jar
security: Accessing keys and certificate in Mozilla user profile: null
security: JSS is not configured
network: Cache entry not found [url: https://popcornmanager.com/manager/grid.1.2.8e.jar, version: null]
network: Connecting https://popcornmanager.com/manager/grid.1.2.8e.jar with proxy=DIRECT
network: Cache entry not found [url: file:/C:/Program%20Files%20(x86)/Java/jre7/lib/ext/sunec.jar, version: null]
basic: Loading Java Applet ...
network: Cache entry not found [url: file:/C:/Program%20Files%20(x86)/Java/jre7/lib/ext/sunjce_provider.jar, version: null]
network: Connecting http://popcornmanager.com:443/ with proxy=DIRECT
security: Loading SSL Root CA certificates from C:\Program Files (x86)\Java\jre7\lib\security\cacerts
security: Loaded SSL Root CA certificates from C:\Program Files (x86)\Java\jre7\lib\security\cacerts
security: Obtain certificate collection in SSL Root CA certificate store {x2}
security: Loading certificates from Deployment session certificate store
security: Loaded certificates from Deployment session certificate store
security: Loaded blacklisted.certs file: D:\AppData\LocalLow\Sun\Java\Deployment\security\blacklisted.certs
security: SHA-256Certificate finger print: E0E41A12187A9196056D01CC1774D98FED57B0B6FD8A035C815C35073EB0A54B
security: SHA-256Certificate finger print: 09ED6E991FC3273D8FEA317D339C02041861973549CFA6E1558F411F11211AA3
security: SHA-256Certificate finger print: 18F8A7A151B4EC280898093DF5BD537CA099CC277405D0281DE0DADFD14420DA
security: SHA-256Certificate finger print: 58D017279CD4DC63ABDDB196A6C9906C30C4E08783EAE8C1609954D69355596B
security: Checking if SSL certificate is in Deployment permanent certificate store
security: Obtain certificate collection in SSL Root CA certificate store {x4}
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
    ...
Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
    ...
Caused by: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
    ...
[try to load https://popcornmanager.com/manager/grid.1.2.8e.jar again]
[try to load https://popcornmanager.com/manager/com/popcornmanager/datagrid/DataGrid.class as above but doesn't throw an exception, twice]

java.lang.ClassNotFoundException: com.popcornmanager.datagrid.DataGrid
    ...
basic: load: class com.popcornmanager.datagrid.DataGrid not found.
java.lang.ClassNotFoundException: com.popcornmanager.datagrid.DataGrid
    ...
Ignored exception: java.lang.ClassNotFoundException: com.popcornmanager.datagrid.DataGrid
basic: Dialog type is not candidate for embedding
security: Reset deny session certificate store
basic: Removed progress listener: sun.plugin.util.ProgressMonitorAdapter@764254
security: Reset deny session certificate store

根据 Java 的规则,某些证书似乎无效,但 v7u67 确实认为它是有效的。我不知道它是否是代码签名证书的 HTTPS 证书(两者都有效)。 HTTPS 通过了浏览器的验证测试。

可以在https://popcornmanager.com/test/TestDataGrid.php查看测试。

我所调查的:

  • 在 Windows 上尝试过 Chrome、Firefox 和 IE,都显示相同的症状。
  • 尝试了<applet><object> 标签,在代码路径中有和没有.class
  • 查看了更新中修复的所有错误,似乎没有一个可以解释这种行为变化。
  • 将 Java 安全设置设置为最低(“中”),将站点添加到例外列表中,并手动将 HTTPS 证书添加到 Java 证书中(看起来当我单击“记住”时自动添加了代码证书在安全对话框中)。

【问题讨论】:

  • 输出似乎表明问题出在代码签名证书而不是 SSL 证书上。您是否验证过代码签名证书的根 CA 在 Java 的已知 CA 列表中?也许该列表在更新 67 和更新 71 之间发生了变化。
  • 最终根 CA 是“AddTrust External CA Root”,我可以在 7u45 和 7u71 根列表中找到它(没有立即可用的 7u67)。使用stackoverflow.com/questions/3508050/… 列出。条目是相同的。有什么方法可以更好地确定导致问题的证书以及原因?我应该联系代码签名证书的颁发者(它仍然有效)吗?
  • 糟糕。我刚刚注意到您最重要的异常是 SSLHandshakeException,这表明 HTTPS 证书而不是代码签名证书存在问题。但是,我刚刚编写了一个小程序,将您的 .jar 提供给 URLClassLoader,classLoader.loadClass("com.popcornmanager.datagrid.DataGrid") 使用 Java 1.7.0_72 非常适合我。
  • 我已经放弃了。 1.7.0_71/1.7.0_72 仍然存在问题,但同一天发布的 Java 8 (1.8.0_25) 可以正常工作,所以我只建议人们改用 Java 8。感谢您的帮助。

标签: java applet signing


【解决方案1】:

查看您的 JAVA 高级设置面板设置并尝试检查 TLS 1.0 并取消选中 TLS 1.1 和 TLS 1.2。

我一直在解决一个问题,即我雇主的 IT 人员将 JAVA JRE 8 u92 推送到我的开发机器上,我无法再访问我们开发并存储在测试服务器上的应用程序。

这几年来每 6 到 12 个月就会发生一次,我不断卸载他们最新的 JRE 并重新安装版本 7u55,从而解决了这个问题。当他们尽我所能将我从 7u55 更新到 7u71 或 72 时就开始了。

这一次我想继续调查和尝试,看看我是否能弄清楚为什么它总是与较新的 JRE 发生冲突。我已经尝试了我能找到的所有东西,由多个可以追溯到 3 年前的线程上发布的,直到我在 Source Forge 上看到某人的匿名帖子之前没有任何效果。

我的设置检查了 TLS 1.0、1.1 和 1.2。该人理论上说这应该没问题,服务器应该选择它想要的任何一个。但只需取消选中 1.1 和 1.2 就可以让我重新启动并运行!

然而,还有一个很大的谜团。我仔细检查了一下,我同事的笔记本电脑检查了 TLS 1.0、1.1 和 1.2,她的笔记本电脑可以通过新的 JRE 8u92 更新正常运行我们的应用程序!她有相同的笔记本电脑型号、相同的操作系统、相同版本的 IE11、相同版本的 JAVA、JAVA 面板中的所有设置(在修改我的 TLS 之前)、IE 中的相同设置、相同的受信任站点等。我们找不到任何理由让其中一个行为与另一个不同。 遇到类似问题的任何人都应该尝试在他们的 JAVA 高级设置面板中取消选中 TLS1.1 和 1.2。 非常感谢上述匿名人士。这次我花了整整 5 个工作日来解决这个问题(每次他们更新我时我都在与它作斗争,试图找到一个解决方案,而不是回滚到一个非常旧的 7u55 JRE!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多