【发布时间】: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。感谢您的帮助。