JSE 1.8,沙箱Java Applet通过HTTPS加载,但使用HTTP检索了crossdomain.xml - java

嗨,所有Java / Applet专家,

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

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

例如,在我们的情况下,服务器IP为192.168.1.1,该小程序通过HTTPS默认端口(443)加载。在Java控制台中使用跟踪级别5,我们看到从crossdomain.xml检索了http://192.168.1.1:443。当然这是行不通的,因为服务器仅侦听端口443上的HTTPS连接(而不侦听HTTP)。

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

随着对该问题的进一步调查,我们再进行一些观察:

使用crossdomain.xml Java VM参数可以提供jnlp.altCrossDomainXMLFiles文件的备用位置。但是,我们从来没有成功使这个参数对我们有用(在java_arguments列表和单独的applet参数中都尝试过)。可能的原因可能是该参数应仅与Webstart应用程序一起使用(尽管在规范中没有专门编写)。
建立Websockets连接时,连接堆栈跟踪如下:

在sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:790)处
sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)在
sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:787)位于
sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)在
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(本机方法)在
java.security.AccessController.doPrivileged(AccessController.java:713)

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.checkConnectHelper(未知
来源)
sun.plugin2.applet.AWTAppletSecurityManager.checkConnect(未知
来源)
sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:624)

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

所以问题是:

可能是JDK错误,还是crossdomain.xml严格使用HTTP是设计使然?
沙盒小程序内是否支持jnlp.altCrossDomainXMLFiles JVM参数?
有没有一种方法可以访问最新版本的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

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java DefaultSslContextFactory密钥库动态更新 - java

我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…