Подтвердить что ты не робот

Как использовать HttpsURLConnection через прокси с помощью setProperty?

Сетевая среда:

Https Client < ============= > Прокси-сервер < ================ > Https-сервер
                                                  192.168.17.11 < ----- экстранет ------ > 192.168.17.22
10.100.21.10 < ---- интрасеть ----- > 10.100.21.11

ps: клиент Http без шлюза по умолчанию, но он может выполнить ping до 10.100.21.11

Описание:

ОС: Ubuntu 12.04 на 3 хоста
Клиент Https: реализация с помощью java (openjdk-6). Имеет один сетевой интерфейс.
Прокси-сервер: Apache2.2. Имеет два сетевых интерфейса.
Сервер Https: Tomcat6.Have один сетевой интерфейс.

Я использую два метода для реализации httpsurlconnection через прокси:
(Для облегчения я не записываю о функции дескриптора ssl для проверки serverTrusted и hostnameVerifier. Если мне нужно будет обновлять.)

1.Proxy class

InetSocketAddress proxyInet = new InetSocketAddress("10.100.21.11",80);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyInet);
URL httpsUrl = new URL("https://192.168.17.22:8443/test");
HttpsURLConnection httpsCon = (HttpsURLConnection) httpsUrl.openConnection(proxy);

httpsCon.setDoOutput(true);
httpsCon.setDoInput(true);
httpsCon.setRequestMethod("POST");
OutputStream out = httpsCon.getOutputStream();
OutputStreamWriter owriter = new OutputStreamWriter(out);

owriter.write("<request>test</request>");
owriter.flush();
owriter.close();
...

Этот метод работоспособный, и я заметил, что поток пакетов также оправдал мое ожидание.
HttpClient --- > ProxyServer --- > HttpServer

Но когда я использую set Property method:

2.setProperty

System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost",10.100.21.11);
System.setProperty("http.proxyPort","80");

URL httpsUrl = new URL("https://192.168.17.22:8443/test");
HttpsURLConnection httpsCon = (HttpsURLConnection)httpsUrl.openConnection();

httpsCon.setDoOutput(true);
httpsCon.setDoInput(true);
httpsCon.setRequestMethod("POST");
OutputStream out = httpsCon.getOutputStream();
OutputStreamWriter owriter = new OutputStreamWriter(out);

owriter.write("<request>test</request>");
owriter.flush();
owriter.close();
...

Я получил NoRouteToHostException: Network is unreachable.
Это заставляет меня запутаться. Я не видел пакетов между HttpClient и ProxyServer.
Но HttpClient может выполнить ping для ProxyServer (10.100.12.10 ping 10.100.21.11)

Итак, я удаляю настройки прокси (как без использования прокси):
Также получил NoRouteToHostException: Network is unreachable.
Я думал, что это разумно. Потому что нет пути к экстрасети.

Мне кажется, что метод setProperty похож на то, что внутренняя функция httpsUrlConnection будет проверять этот URL-адрес.

Но это странно. Первый способ может быть успешным.

Есть идеи? Или что отличает 1-й и 2-й методы?

+++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++

Update

System.setProperty("https.proxyHost",10.100.21.11);
System.setProperty("https.proxyPort","80"); 

Он может работать, и поток пакетов правильный, что я ожидаю.
Но set https.proxyPort = 443 не работает для меня

System.setProperty("https.proxyPort","443");

В качестве исключения будет приведено исключение:

java.net.SocketException: Unexpected end of file from server 
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:770)
....

Итак, я думал, что Apache Proxy также должен быть изменен в правильной конфигурации.

4b9b3361

Ответ 1

Ваше URL-соединение - https, тогда как вы устанавливаете только http-прокси.

Попробуйте установить прокси-сервер https.

//System.setProperty("https.proxySet", "true"); 
 System.setProperty("https.proxyHost",10.100.21.11);
 System.setProperty("https.proxyPort","443");

ИЗМЕНИТЬ @EJP является правильным. Нет https.proxySet.. Я скопировал ваш оригинальный вопрос и включил его в ответ.

Ответ 2

Вам понадобится создать для него объект Proxy. Создайте его, как показано ниже:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyServer, Integer.parseInt(proxyPort)));

Теперь используйте этот прокси для создания объекта HttpURLConnection.

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);

Если вам нужно установить учетные данные для прокси-сервера, установите свойство запроса Proxy-Authorization:

String uname_pwd = proxyUsername + ":" + proxyPassword
String authString = "Basic " + new sun.misc.BASE64Encoder().encode(uname_pwd.getBytes())
connection.setRequestProperty("Proxy-Authorization", authString);

И, наконец, вы подключаетесь:

connection.connect();