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

时间:2014-09-23 09:14:43

标签: java applet java-8 sandbox 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,我们看到从crossdomain.xml检索到http://192.168.1.1:443。当然它不起作用,因为服务器只侦听端口443(而不是HTTP)上的HTTPS连接。

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

随着问题的进一步深入研究,我们进行了更多的观察:

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

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

  3.   

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

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

    所以问题是:

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

    2. Sandbox小程序中是否支持jnlp.altCrossDomainXMLFiles JVM参数?

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

    4. 非常感谢你。

      祝你好运, 标记

2 个答案:

答案 0 :(得分:0)

为了摆脱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

答案 1 :(得分:0)

我们在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();
}