¿Cómo usar HttpsURLConnection a través de proxy por setProperty?
Entorno de red:
Cliente Https <=============> Servidor Proxy <==============> Servidor Https
192.168.17.11 <-----extranet------> 192.168.17.22
10.100.21.10 <----intranet-----> 10.100.21.11
ps: Cliente HTTP sin puerta de enlace predeterminada, pero puede hacer ping a 10.100.21.11
Descripción:
OS: Ubuntu 12.04 en 3 hosts
Cliente Https: Implementar con java (openjdk-6). Tener una interfaz de red.
Servidor proxy: Apache2.2. Tiene dos interfaces de red.
Servidor Https: Tomcat6.Have una interfaz de red.
Uso dos métodos para implementarhttpsurlconnection a través de proxy:
(Para facilitar, no escribo sobre la función de manejo de SSL para verificarserverTrusted yhostnameVerifier problema. Si es necesario voy a actualizar.)
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();
...
Este método era viable y observé que el flujo de paquetes también cumplía con mis expectativas.
HttpClient ---> ProxyServer ---> HttpServer
Pero cuando uso el método Set Property:
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();
...
Conseguí unNoRouteToHostException: Network is unreachable
.
Me confunde. No vi ningún paquete entre HttpClient y ProxyServer.
Pero HttpClient puede hacer ping a ProxyServer (10.100.12.10 ping 10.100.21.11)
Así que elimino la configuración de proxy (como sin usar proxy):
También consiguióNoRouteToHostException: Network is unreachable
.
Pensé que esto es razonable. Porque no hay ruta a la extranet.
Supongo que parecesetProperty Método que la función interna dehttpsUrlConnection La voluntad de comprobar esta url puede ser accesible o no.
Pero es raro. El primer método puede ser el éxito.
¿Tienes alguna idea? ¿O cuáles son las diferencias entre el primer y segundo método?
+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++
ActualizarSystem.setProperty("https.proxyHost",10.100.21.11);
System.setProperty("https.proxyPort","80");
Puede funcionar y el flujo de paquetes es correcto para lo que espero.
Pero el conjunto https.proxyPort = 443 no es viable para mí
System.setProperty("https.proxyPort","443");
Se emitirá una excepción de la siguiente manera:
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:770)
....
Así que pensé que Apache Proxy también tiene que ser modificado a la configuración correcta.