tlsv1 tls the that supported protocol not example enabled enable dhttps chose but java networking proxy outputstream httpsurlconnection

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.11

ps: 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.