java - tls - ¿Cómo usar HttpsURLConnection a través de proxy por setProperty?
server chose tlsv1 but that protocol version is not enabled or not supported by the client (2)
Entorno de red:
Https Client <=============> Proxy Server <==============> Servidor Https
192.168.17.11 <----- extranet ------> 192.168.17.22
10.100.21.10 <---- Intranet -----> 10.100.21.11ps: Http Client sin puerta de enlace predeterminada, pero puede hacer ping a 10.100.21.11
Descripción:
Sistema operativo: Ubuntu 12.04 en 3 hosts
Https Client: Implementar con java (openjdk-6). Tener una interfaz de red.
Servidor Proxy: Apache2.2.Tiene dos interfaces de red.
Servidor Https: Tomcat6.Tiene una interfaz de red.
Utilizo dos métodos para implementar httpsurlconnection a través del proxy:
(Para facilitarlo, no escribo sobre la función de manejo de ssl para verificar el problema de ServerTrusted y hostnameVerifier. Si es necesario lo actualizaré).
Clase 1.Proxy
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 viable y observé que el flujo de paquetes también cumplió con mis expectativas.
HttpClient ---> ProxyServer ---> HttpServer
Pero cuando uso el método set Property:
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
una NoRouteToHostException: Network is unreachable
.
Me hace confundir. 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 del proxy (como sin usar el proxy):
También obtuve NoRouteToHostException: Network is unreachable
.
Pensé que esto es razonable. Porque no hay una ruta para extranet.
Supongo que parece establecer el método Property que la función interna de httpsUrlConnection permitirá verificar que esta url sea alcanzable o no.
Pero es extraño. El primer método puede ser exitoso.
¿Tienes alguna idea? ¿O qué hay de diferente entre el 1er y el 2do método?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++
Actualizar
System.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 establecer https.proxyPort = 443 no es viable para mí
System.setProperty("https.proxyPort","443");
Hará una excepción como abajo:
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:770)
....
Así que pensé que el Proxy Apache también debe ser modificado a la configuración correcta.
Necesitarás crear un objeto Proxy
para él. Crea uno de la siguiente manera:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyServer, Integer.parseInt(proxyPort)));
Ahora usa este proxy para crear el objeto HttpURLConnection
.
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy);
Si debe establecer las credenciales para el proxy, configure la propiedad de solicitud de Proxy-Authorization
:
String uname_pwd = proxyUsername + ":" + proxyPassword
String authString = "Basic " + new sun.misc.BASE64Encoder().encode(uname_pwd.getBytes())
connection.setRequestProperty("Proxy-Authorization", authString);
Y finalmente, te conectas:
connection.connect();
Su conexión de URL es https, mientras que solo está configurando el proxy http.
Intenta configurar el proxy https.
//System.setProperty("https.proxySet", "true");
System.setProperty("https.proxyHost",10.100.21.11);
System.setProperty("https.proxyPort","443");
EDITAR @EJP es correcto. No hay https.proxySet. Copié tu pregunta original y la incluí en la respuesta.