gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:20:12 25 4
gpt4 key购买 nike

大家好,Java/Applet 大师们,

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

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

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

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

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

  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) at com.sun.deploy.net.CrossDomainXML.check(Unknown Source) at com.sun.deploy.net.CrossDomainXML.check(Unknown Source) at sun.plugin2.applet.SecurityManagerHelper.checkConnectHelper(Unknown Source) at sun.plugin2.applet.AWTAppletSecurityManager.checkConnect(Unknown Source) at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:624)

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

所以问题是:

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

  2. 沙盒小程序是否支持 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

关于java - JSE 1.8,通过 HTTPS 加载的沙盒 Java Applet,但使用 HTTP 检索 crossdomain.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25991249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com