Доступ к внешним ресурсам из java приложения

sparkyshark

New member
Сообщения
8
#1
Здравствуйте.

Помогите решить проблему с внешними обращениями из java приложения в astra linux.

Картина следующая:
Есть astra linux (смоленск 1.6) на которой из java приложения не получается вызвать сервисы из интернет.
Не можем понять, в чем проблема и в какую сторону копать.
При этом из этого же приложения доступ к локальным(в нашей сети) ресурсам есть. Доступ через curl и wget к внешним ресурсам есть. Доступ из dotnet приложения к внешнем ресурсам тоже есть.
Режим замкнутой программной среды отключен.
Java 1.8

Если запускать java приложение не в astra linux то все работает(другой хост с linux или windows ОС).

jar файл во вложении:
Пример запуска:
Обращение к локальному сайту:
root@astra-test-dev:/home# java -jar network_test_simple-1.jar http://внутренний_url_или_ip
<!DOCTYPE html>
200
OK

Если обращаться к внешке, приложение просто висит и отрубается по таймауту:
root@astra-test-dev:/home# java -jar network_test_simple-1.jar http://внешний_урл
 

sparkyshark

New member
Сообщения
8
#2
Упростил демо-код до следующего:
import java.io.*;
import java.net.*;

public class hw {

public static String getHTML(String urlToRead) throws Exception {
StringBuilder result = new StringBuilder();
URL url = new URL(urlToRead);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
result.append(line);
}
rd.close();
return result.toString();
}

public static void main(String[] args) throws Exception
{
System.out.println(getHTML(args[0]));
}
}
 

sparkyshark

New member
Сообщения
8
#5
Причина проблемы: стандартный User-Agent имеет вид типа Java [Version] и какое-то сетевое устройство типа IDS его не пропускает, считая какой-то атакой. Поправили настройки сети, все заработало.
 

Olej

New member
Сообщения
1 307
#6
стандартный User-Agent имеет вид типа Java [Version]
User-Agent формируется именно запрашивающим приложением ... когда-то возился достаточно изрядно о User-Agent браузеров и его подмене в запросе, см. Изменение идентификации браузера.
Но как идентифицирует себя пакеты Java никак не сталкивался.
Поправили настройки сети, все заработало.
Как, какими настройками сети что поменяли и как?
Достаточно естественно, если бы поменяли идентификацию User-Agent приложением, когда это общими настройками сети - это как-то не очень понятно.
Опять же, любопытно: кто и как реагирует на User-Agent в Astra Linux SE, если во всех остальных Linux (общего применения) этого не происходит. И как и на какие User-Agent оно реагирует, а какие считает "пущай будет". ;)

P.S. Потому что сегодня это вылезло в Java ... но завтра оно вылезет у кого-то при использовании пакетов/модулей, скажем, Python или Go (важно, что причина сокрыта именно внутри внешнего пакета/модуля по отношению к отрабатываемому коду).
 

Olej

New member
Сообщения
1 307
#7
стандартный User-Agent имеет вид типа Java [Version]
Я взял, проверил ваш же код (чтобы однозначно), на проверку того, что в User-Agent зановит Java-библиотека:
Код:
olej@ACER:~/2019_WORK/own.WORK/User-Agent$ java ua https://httpbin.org/get
{  "args": {},   "headers": {    "Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2",     "Host": "httpbin.org",     "User-Agent": "Java/11.0.5"  },   "origin": "193.28.177.125, 193.28.177.125",   "url": "https://httpbin.org/get"}

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ java --version
openjdk 11.0.5 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Debian-1deb10u1, mixed mode, sharing)
Это Debian 10 (чтоб быстрее, что было под рукой), но это не имеет здесь никакого значения...
User-Agent здесь: Java/11.0.5
 
Последнее редактирование:

Olej

New member
Сообщения
1 307
#8
и какое-то сетевое устройство типа IDS его не пропускает, считая какой-то атакой.
Т.е. проблема никак не связана с Java, а связана с Astra Linux SE и тем, как оно реагирует на клиентский User-Agent.
Что существенно интереснее, чем начальная задача. ;)
 

Olej

New member
Сообщения
1 307
#9
Т.е. проблема никак не связана с Java, а связана с Astra Linux SE и тем, как оно реагирует на клиентский User-Agent.
Клиент(-ы) Python ... т.е. то как они устанавливают User-Agent:
Код:
olej@ACER:~$ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> response = requests.get('https://httpbin.org/get')
>>> print(response.content)
b'{\n  "args": {}, \n  "headers": {\n    "Accept": "*/*", \n    "Accept-Encoding": "gzip, deflate", \n    "Host": "httpbin.org", \n    "User-Agent": "python-requests/2.21.0"\n  }, \n  "origin": "193.28.177.125, 193.28.177.125", \n  "url": "https://httpbin.org/get"\n}\n'
>>> response.json()
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.21.0'}, 'origin': '193.28.177.125, 193.28.177.125', 'url': 'https://httpbin.org/get'}
>>> response.json().get('headers').get('User-Agent')
'python-requests/2.21.0'
Код:
olej@ACER:~$ pip3 list | grep requests
requests                2.21.0
Здесь User-Agent - это python-requests/2.21.0
И совсем другой стандартный модуль Python:
Код:
>>> import urllib.request
>>> response = urllib.request.urlopen( 'https://httpbin.org/get' )
>>> print( response.getcode() )
200
>>> print( response.read() )
b'{\n  "args": {}, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Host": "httpbin.org", \n    "User-Agent": "Python-urllib/3.7"\n  }, \n  "origin": "193.28.177.125, 193.28.177.125", \n  "url": "https://httpbin.org/get"\n}\n'
Код:
olej@ACER:~$ python3 --version
Python 3.7.3
Как легко видеть, здесь User-Agent - это Python-urllib/3.7 ... что радикально отличается от предыдущего случая.
Т.е. в зависимости от используемых модулей в User-Agent может быть вписано всё что угодно.

P.S. Естественно, то что показано, показано не в Astra Linux SE, иначе клиент с такими User-Agent просто не должен получить ответ и мы не увидим значения его User-Agent.
 

Olej

New member
Сообщения
1 307
#10
Т.е. проблема никак не связана с Java, а связана с Astra Linux SE и тем, как оно реагирует на клиентский User-Agent.
Язык Go... с разными 2-мя основными компиляторами...
Код:
olej@ACER:~/2019_WORK/own.WORK/User-Agent$ cat ua.go
package main
import (
    "fmt"
    "net/http"
    "io"
    "os"
)
func main() { 
   client := http.Client{} 
   resp, err := client.Get( "https://httpbin.org/get" ) 
   if err != nil { 
         fmt.Println( err ) 
         return
   } 
   defer resp.Body.Close() 
   io.Copy( os.Stdout, resp.Body )
}
Компилятор GoLang:
Код:
olej@ACER:~/2019_WORK/own.WORK/User-Agent$ go build ua.go 

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ./ua
{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1"
  }, 
  "origin": "193.28.177.125, 193.28.177.125", 
  "url": "https://httpbin.org/get"
}

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ls -l ua
-rwxr-xr-x 1 olej olej 6143867 ноя 18 15:46 ua

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ldd ua
    linux-vdso.so.1 (0x00007ffc9f77d000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdd70ab0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd708ef000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fdd70b09000)
Компилятор GCC Go:
Код:
olej@ACER:~/2019_WORK/own.WORK/User-Agent$ gccgo ua.go -o ua.gcc

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ./ua.gcc 
{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1"
  }, 
  "origin": "193.28.177.125, 193.28.177.125", 
  "url": "https://httpbin.org/get"
}

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ls -l ua.gcc
-rwxr-xr-x 1 olej olej 51800 ноя 18 15:48 ua.gcc

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ldd ua.gcc
    linux-vdso.so.1 (0x00007ffe1cf18000)
    libgo.so.13 => /lib/x86_64-linux-gnu/libgo.so.13 (0x00007f67a27f2000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f67a266f000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f67a2655000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f67a2494000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f67a4039000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f67a2276000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f67a2255000)
Хотя всё существенно отличается (сборка: статическая/динамическая, библиотеки...) но в User-Agent: "Go-http-client/1.1"
 

Olej

New member
Сообщения
1 307
#11
Клиент(-ы) Python ... т.е. то как они устанавливают User-Agent:
Сделал то же (хотя бы отчасти) в Astra Linux SE 1.6 ... и к своему изумлению :eek: - обнаружил:
Код:
olej@astra:~$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib.request
>>> response = urllib.request.urlopen( 'https://httpbin.org/get' )
>>> print( response.getcode() )
200
>>> print( response.read() )
b'{\n  "args": {}, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Host": "httpbin.org", \n    "User-Agent": "Python-urllib/3.5"\n  }, \n  "origin": "193.28.177.125, 193.28.177.125", \n  "url": "https://httpbin.org/get"\n}\n'
>>>
Т.е. без любых перенастроек сети, с произвольным с потолка взятым User-Agent = "Python-urllib/3.5", Astra Linux SE замечательно коннектится к внешнему URL!
 

Olej

New member
Сообщения
1 307
#12
и к своему изумлению :eek: - обнаружил:
Удивлённый таким результатом, я воспроизвёл ваше приложение...
Код:
olej@astra:~/WORK/java$ javac ua.java

olej@astra:~/WORK/java$ ls -l ua*
-rw-r--r-- 1 olej olej 1272 ноя 18 18:15 ua.class
-rw-r--r-- 1 olej olej  707 ноя 18 18:15 ua.java
Если обращаться к внешке, приложение просто висит и отрубается по таймауту:
И получил совершенно другое поведение, чем то которое вы описываете:
Код:
olej@astra:~/WORK/java$ java ua https://httpbin.org/get
Exception in thread "main" javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1964)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1921)
        at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1904)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1420)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
        at ua.getHTML(ua.java:10)
        at ua.main(ua.java:20)
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:91)
        at sun.security.validator.Validator.getInstance(Validator.java:181)
        at sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:312)
        at sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.java:171)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:184)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1615)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1052)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:987)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
        ... 8 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
        at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:120)
        at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:104)
        at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:89)
        ... 20 more
Мгновенное аварийное завершение, с более-менее внятной диагностикой, которую можно копать дальше на предмет деталей параметров вызовов...

Это Astra Linux SE 1.6 без каких-либо модификаций настроек.
 
Последнее редактирование:

oko

New member
Сообщения
1 257
#13
*в сторону*
Наглядный пример как первичное неуважение собеседника, помноженное на желание всюду флудить, рождает полотна текста аля "54 метра" и излишние ошибки SSL при неверном тесте приложения...

to Olej
Есть astra linux (смоленск 1.6) на которой из java приложения не получается вызвать сервисы из интернет.
При этом из этого же приложения доступ к локальным(в нашей сети) ресурсам есть. Доступ через curl и wget к внешним ресурсам есть.
какое-то сетевое устройство типа IDS его не пропускает
Явно не проблема Astra Linux, а проблема сетевой инфраструктуры организации. Вот тов. sparkyshark обалдеет, прогнозирую...
 

Olej

New member
Сообщения
1 307
#14
Последнее редактирование:

oko

New member
Сообщения
1 257
#15
to Olej
Спокойнее, тов. Цилюрик, спокойнее. Сфинктер у вас уже ни к черту дерьмо в разные стороны так и льется. Вдруг давление превысит критическое и сердце не выдержит. Не хорошо это...
А по SSL рекомендую перечитать и найти нужное отличие самостоятельно (раз уж в java exceptions не получилось, ага):
root@astra-test-dev:/home# java -jar network_test_simple-1.jar http://внешний_урл
 

Olej

New member
Сообщения
1 307
#16
Долбоёба oko мы оставим вне внимания...
Но!:
Код:
olej@astra:~/WORK/java$ java ua http://example.org
<!doctype html><html><head>    <title>Example Domain</title>    <meta charset="utf-8" />    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />    <meta name="viewport" content="width=device-width, initial-scale=1" />    <style type="text/css">    body {        background-color: #f0f0f2;        margin: 0;        padding: 0;        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;            }    div {        width: 600px;        margin: 5em auto;        padding: 2em;        background-color: #fdfdff;        border-radius: 0.5em;        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);    }    a:link, a:visited {        color: #38488f;        text-decoration: none;    }    @media (max-width: 700px) {        div {            margin: 0 auto;            width: auto;        }    }    </style>    </head><body><div>    <h1>Example Domain</h1>    <p>This domain is for use in illustrative examples in documents. You may use this    domain in literature without prior coordination or asking for permission.</p>    <p><a href="https://www.iana.org/domains/example">More information...</a></p></div></body></html>
Это всего лишь поменялся URL цели в вызове.
А Exception, как я могу только очень предварительно предположить, возникает на формате ответа от URL.
 
Последнее редактирование:

Olej

New member
Сообщения
1 307
#17
стандартный User-Agent имеет вид типа Java [Version] и какое-то сетевое устройство типа IDS его не пропускает, считая какой-то атакой.
Т.е. и идентификации клиента в User-Agent, с чего началось рассмотрение этой темы, эти эффекты (отказ в коннекте) не имеет никакого отношения.
 

oko

New member
Сообщения
1 257
#18
to Olej
Проще, любезнейший, проще. Запомните отсюда и навсегда: раз уж взялись проверять чужие примеры, тестите их аля топикстартер. А не как дурак, заменяя открытое соединение защищенным и вопя про <Мгновенное аварийное завершение>...
И еще одно. RTFM про сигнатурный анализ UA-записей в трафике - авось все на свои места и встанет. Потому что упоминение <идентификации клиента в User-Agent> в означенном контексте заталкивает вас еще глубже в пучину бессмысленности и бесполезности...

to sparkyshark
Кстати о птичках. Если засунуть трафик в VPN-упаковку, ваша IPS вполне может перестать ругаться...
Или на крайний случай подменять UA на промежуточной проксе. Если с отделом ИБ не договориться, конечно :)
 
Последнее редактирование:

Olej

New member
Сообщения
1 307
#19
Если обращаться к внешке, приложение просто висит и отрубается по таймауту:
root@astra-test-dev:/home# java -jar network_test_simple-1.jar http://внешний_урл
Ничего подобного тому что у вас не наблюдается:
Код:
olej@astra:~/WORK/java$ java ua http://httpbin.org/get
{  "args": {},   "headers": {    "Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2",     "Host": "httpbin.org",     "User-Agent": "Java/1.8.0_181"  },   "origin": "193.28.177.125, 193.28.177.125",   "url": "https://httpbin.org/get"}
Это выполняется в точности ваш код, компилированный в ua.class, Astra Linux SE 1.6 без каких-либо специально специфических настроек.
Ищите другую причину тому, что вы наблюдаете.

И по этому URL вы можете контролировать "в обратку" те заголовки, которые ваш код отсылает в GET запросе. Можете тот же URL посмотреть в браузере и наблюдать что-то типа:
Код:
{
  "args": {},
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
    "Dnt": "1",
    "Host": "httpbin.org",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36 OPR/65.0.3467.42"
  },
  "origin": "193.28.177.125, 193.28.177.125",
  "url": "https://httpbin.org/get"
}
 
Последнее редактирование:

oko

New member
Сообщения
1 257
#20
to Olej
Мне казалось, что весь наш диалог - прикол (как всегда, ага). А вы, оказывается, реально не догоняете даже после объяснения деталей. Забавно...