大家好,所有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,这是完全正确的
随着问题的进一步深入研究,我们进行了更多的观察:
可以使用crossdomain.xml
Java VM参数提供jnlp.altCrossDomainXMLFiles
文件的备用位置。我们永远不会成功使这个参数适用于我们(在java_arguments列表和单独的applet参数中都尝试过)。可能的原因可能是该参数应仅用于Webstart应用程序(尽管它不是专门针对规范编写的)。
建立Websockets连接时,连接堆栈跟踪如下:
在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连接。
所以问题是:
可能是JDK错误还是crossdomain.xml
对HTTP的严格使用是设计的?
Sandbox小程序中是否支持jnlp.altCrossDomainXMLFiles
JVM参数?
有没有办法访问最新版本的com.sun.deploy.net.CrossDomainXML.java
源代码,以全面了解正在发生的事情?
非常感谢你。
祝你好运, 标记
答案 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();
}