Сетевая среда:
Https Client < ============= > Прокси-сервер < ================ > Https-сервер
192.168.17.11 < ----- экстранет ------ > 192.168.17.22
10.100.21.10 < ---- интрасеть ----- > 10.100.21.11ps: клиент 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 также должен быть изменен в правильной конфигурации.