web-dev-qa-db-fra.com

Comment utiliser HttpsURLConnection via proxy par setProperty?

Environnement réseau:

Client Https <=============> Serveur proxy <==============> Serveur Https
192.168.17.11 <-----extranet------> 192.168.17.22
10.100.21.10 <----intranet-----> 10.100.21.11

ps: Client Http sans passerelle par défaut, mais il peut envoyer une requête ping vers 10.100.21.11

La description:

OS: Ubuntu 12.04 sur 3 hôtes
Client Https: Implémenter avec Java (openjdk-6). Avoir une interface réseau.
Serveur proxy: Apache2.2. Possède deux interfaces réseau.
Serveur Https: Tomcat6.Avoir une interface réseau.

J'utilise deux méthodes pour implémenter httpsurlconnection via un proxy:
(Pour faciliter je n'écris pas sur la fonction de poignée SSL pour vérifier serverTrusted et hostnameVerifier issue.Si besoin, je mettrai à jour.)

1. classe 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();
...

Cette méthode était réalisable et j'ai observé que le flux de paquets répondait également à mes attentes.
HttpClient ---> ProxyServer ---> HttpServer

Mais quand j'utilise la méthode 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();
...

J'ai un NoRouteToHostException: Network is unreachable.
Cela me rend confus. Je n'ai vu aucun paquet entre HttpClient et ProxyServer.
Mais HttpClient peut envoyer une requête ping à ProxyServer (10.100.12.10 ping 10.100.21.11)

Je supprime donc le paramètre proxy (comme sans utiliser de proxy):
A aussi NoRouteToHostException: Network is unreachable.
J'ai pensé que c'était raisonnable. Parce qu'il n'y a pas de chemin vers l'extranet.

Je suppose qu'il semble que setProperty méthode que la fonction interne de httpsUrlConnection volonté de vérifier cette URL peut être accessible ou non.

Mais c'est bizarre. La 1ère méthode peut être un succès.

Vous avez une idée? Ou quelles sont les différences entre la 1ère et la 2ème méthode?

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

Mettre à jour

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

Cela peut fonctionner et le flux de paquets est correct à ce que j'attends.
Mais définir https.proxyPort = 443 ne fonctionne pas pour moi

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

Il en résultera une exception comme ci-dessous:

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

J'ai donc pensé qu'Apache Proxy devait également être modifié pour la bonne configuration.

14
CJeremy

Votre connexion URL est https alors que vous ne définissez que le proxy http.

Essayez de définir le proxy https.

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

MODIFIER @EJP est correct. Il n'y a pas https.proxySet .. J'ai copié votre question d'origine et inclus dans la réponse.

17
Kal

Vous devrez créer un objet Proxy pour cela. Créez-en un comme ci-dessous:

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

Utilisez maintenant ce proxy pour créer l'objet HttpURLConnection.

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

Si vous devez définir les informations d'identification pour le proxy, définissez le Proxy-Authorization demande de propriété:

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

Et enfin, vous vous connectez:

connection.connect();
9
divinedragon