如何通过的setProperty使用HttpsURLConnection的通过代理?(How to

2019-08-21 07:23发布

网络环境:

HTTPS客户端<=============>代理服务器<==============> HTTPS服务器
192.168.17.11 <-----外联网------> 192.168.17.22
10.100.21.10 <----内联网-----> 10.100.21.11

PS:没有的Http默认网关的客户端,但它可以ping到10.100.21.11

描述:

操作系统:Ubuntu的12.04 3个主机
HTTPS客户端:用java(的openjdk-6)。有一个网络接口实现。
代理服务器:Apache2.2.Have两个网络接口。
HTTPS服务器:Tomcat6.Have一个网络接口。

我使用两种方法,通过代理实现HttpsURLConnection的
(为了方便我不写下关于SSL处理功能检查serverTrusted的HostnameVerifier issue.If需要我会更新。)

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

这种方法可行,我观察到的数据包流也遇到了我的意料。
HttpClient的--->访问代理服务器--->的HttpServer

但是,当我用一套房产方法:

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
这让我confused.I没有看到之间的HttpClient和访问代理服务器的任何数据包。
但是,HttpClient的可以ping到访问代理服务器(10.100.12.10平10.100.21.11)

所以我删除代理服务器设置(如不使用代理):
也得到了NoRouteToHostException: Network is unreachable
我认为这是reasonable.Because有到外网的路由。

我想这好像给setProperty方法是HttpsURLConnection的的内部函数会检查这个网址可以到达与否。

但它是怪异。 第一个方法可以成功。

有什么想法? 或者有什么是第一和第二方法之间有什么不同?

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

更新

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

它可以工作,数据包流是正确的我所期望的。
但设置https.proxyPort = 443是行不通的,我

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

它将thorow一个例外波纹管:

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

因此,我认为Apache代理也纷纷进行修改,以正确的配置。

Answer 1:

您的网址连接是HTTPS,而你只设置HTTP代理。

尝试将HTTPS代理。

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

编辑 @EJP是正确的。 没有https.proxySet ..我复制你原来的问题,并列入了答案。



Answer 2:

您将需要创建一个Proxy对象吧。 创建一个如下图所示:

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

现在使用这个代理来创建HttpURLConnection对象。

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

如果你必须设置的凭据代理设置Proxy-Authorization请求属性:

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

最后,您连接:

connection.connect();


文章来源: How to use HttpsURLConnection through proxy by setProperty?