JSE 1.8,Sandbox Java Applet通过HTTPS加载,但是使用HTTP检索了crossdomain.xml

大家好,所有的Java / Applet专家,

我偶然发现了最新JDK版本(1.8.0_b26)的一个有趣问题。

当使用最新的JDK运行Sandbox Java Applet时,我们尝试使用不同的协议连接回服务器 – 而不是原始的HTTPS我们使用WSS(安全的Websockets连接,我们使用第三方Websockets客户端Java库)。 结果,JVM尝试从服务器检索crossdomain.xml文件。 问题是,使用HTTP(而不是HTTPS)协议检索文件。

例如,在我们的例子中,服务器IP是192.168.1.1,applet是通过HTTPS默认端口(443)加载的。 在Java控制台中使用跟踪级别5,我们看到从http://192.168.1.1:443检索了crossdomain.xml 。 当然它不起作用,因为服务器只侦听端口443(而不是HTTP)上的HTTPS连接。

另一方面,当我们使用HTTP协议并向服务器打开新的WS(不安全的Websockets连接)时,问题不会出现,因为从http://192.168.1.1:80检索到crossdomain.xml并且它完全是正确。

随着问题的进一步调查,我们进行了更多的观察:

  1. 可以使用jnlp.altCrossDomainXMLFiles Java VM参数提供crossdomain.xml文件的替代位置。 我们永远不会成功使这个参数适用于我们(在java_arguments列表和单独的applet参数中都尝试过)。 可能的原因可能是该参数应仅用于Webstart应用程序(尽管它不是专门针对规范编写的)。

  2. 建立Websockets连接时,连接堆栈跟踪如下:

at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:790)at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)at sun.net.www.http.HttpClient.parseHTTPHeader (HttpClient.java:787)at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1534)at sun。 net.www.protocol.http.HttpURLConnection.access $ 200(HttpURLConnection.java:90)at sun.net.www.protocol.http.HttpURLConnection $ 9.run(HttpURLConnection.java:1431)at sun.net.www.protocol。 http.HttpURLConnection $ 9.run(HttpURLConnection.java:1429)at java.security.AccessController.doPrivileged(Native Method)at java.security.AccessController.doPrivileged(AccessController.java:713)at sun.net.www.protocol.http .httpURLConnection.getInputStream(HttpURLConnection.java:1428)位于com.sun.deploy.net.CrossDomainXML.check(未知来源)的com.sun.deploy.net.CrossDomainXML.check(未知来源)sun.plugin2.applet。 SecurityManagerHelper.checkConne 来自sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:624)的sun.plugin2.applet.AWTAppletSecurityManager.checkConnect(未知来源)的ctHelper(未知来源)

因此,我们查看了CrossDomainXML.java类的最新公开源代码(尽管从2010年开始)。 从代码中可以看出,无论原始浏览器连接是什么,从服务器检索crossdomain.xml文件时始终使用http连接。

所以问题是:

  1. 可能是JDK错误还是对crossdomain.xml严格使用HTTP是设计的?

  2. 是否在jnlp.altCrossDomainXMLFiles applet中支持jnlp.altCrossDomainXMLFiles JVM参数?

  3. 有没有办法访问最新版本的com.sun.deploy.net.CrossDomainXML.java源代码,以全面了解正在发生的事情?

非常感谢你提前。

最好的问候,马克

为了摆脱http://myhost/crossdomain.xml请求,除了在java.policy文件中添加这样的内容之外,你无能为力:

 permission java.net.SocketPermission "myhost:1024-", "connect, resolve"; 

您可以将其限制为特定的证书签名者以实施此策略,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html#SocketPermission

我们在init-process(applet构造函数)早期的applet中使用它,它可以工作:

 try { System.setProperty("jnlp.altCrossDomainXMLFiles", // "http://www.some-domain.de/crossdomain.xml" // + ",https://www.secure-domain.de:8443/crossdomain.xml" // ); } catch (Exception e) { e.printStackTrace(); }