JSE 1.8, Java-апплет песочницы загружен по HTTPS, но crossdomain.xml получен по HTTP
Привет всем Java/Applet гуру,
Я наткнулся на интересную проблему с последней сборкой JDK (1.8.0_b26).
При запуске Java-апплета Sandbox с последней версией JDK из кода Java мы пытаемся подключиться к серверу с другим протоколом - вместо оригинального HTTPS мы используем WSS (защищенное соединение Websockets, мы используем стороннюю клиентскую библиотеку Websockets Client Java). В результате JVM пытается получить crossdomain.xml
файл с сервера. Проблема в том, что файл извлекается по протоколу HTTP (а не HTTPS).
Например, в нашем случае IP-адрес сервера - 192.168.1.1, апплет загружен через порт HTTPS по умолчанию (443). Используя уровень трассировки 5 в консоли Java, мы видим, что crossdomain.xml
извлекается из http://192.168.1.1:443
, И, конечно, это не работает, потому что сервер прослушивает только HTTPS-соединения через порт 443 (а не HTTP).
С другой стороны, когда мы используем протокол HTTP и открываем новый WS (незащищенное соединение Websockets) с сервером, проблема не появляется, потому что crossdomain.xml извлекается из http://192.168.1.1:80
и это совершенно правильно.
Поскольку проблема была дополнительно исследована, мы сделали еще несколько наблюдений:
Можно предоставить альтернативное местоположение
crossdomain.xml
использование файлаjnlp.altCrossDomainXMLFiles
Параметр Java VM. Нам так и не удалось заставить этот параметр работать для нас (пробовал как в списке java_arguments, так и в качестве параметра lone 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.HttpHlient (HttpClient.java:787) на sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647) на sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:34) 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.htpro.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 года). И из кода видно, что http соединение всегда используется при получении crossdomain.xml
файл с сервера, независимо от того, что является исходным подключением браузера.
Итак, вопросы:
Это может быть ошибка JDK или строгое использование HTTP для
crossdomain.xml
это по дизайну?Является
jnlp.altCrossDomainXMLFiles
Параметр JVM поддерживается внутри апплета Sandbox?Есть ли способ доступа к последней версии
com.sun.deploy.net.CrossDomainXML.java
исходный код, чтобы получить полную картину того, что происходит?
Заранее большое спасибо.
С наилучшими пожеланиями, Марк
2 ответа
Чтобы избавиться от запроса 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
Мы используем его в апплете в начале процесса инициализации (конструктор апплета), и он работает:
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();
}