我在制作依赖于设置http.proxyPort
和http.proxyHost
的Java应用程序。有两个过程:一个是正常程序,另一个是代理。我有一个简单的套接字侦听器,运行在http.proxyPort
(我控制)上。它是那样简单Java https代理(使用https.proxyPort和https.proxyHost)
while (true) {
try {
Socket connection = server.accept();
Handler handler = new Handler(connection);
handler.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
所以每当 “处理1” 发出HTTP请求 - 像
URL yahoo = new URL("http://www.google.ca/");
URLConnection yc = yahoo.openConnection();
System.out.println(yc.getClass().getName());
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
它去通过代理。现在如果客户端使用HTTPS协议呢?喜欢改用https://google.ca
?有一个属性https.proxyPort
和https.proxyHost
,但我真的一直在努力几个月(开,关,这不是太重要),没有运气。我读过一堆线程(我会在最后列出一些,所以你知道我已经做了一些事情)。
到目前为止我最亲密的尝试: 服务器
try {
System.setProperty("javax.net.ssl.keyStore", "test.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "2520xe");
SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
System.out.println("Ready");
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
OutputStream toClient = sslsocket.getOutputStream();
toClient.write(("HTTP/1.0 200 Connection established\n" +
"Content-Length: " + "Shut down!".getBytes().length
+ "\r\n").getBytes("utf-8"));
toClient.write("Shut down!".getBytes("utf-8"));
toClient.close();
} catch (Exception exception) {
exception.printStackTrace();
}
客户
try {
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("https.proxyPort", "9999");
URL yahoo = new URL("https://www.google.ca/");
URLConnection yc = yahoo.openConnection();
System.out.println(yc.getClass().getName());
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
} catch (Exception ex) {
ex.printStackTrace();
}
而且我得到这个错误javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
我GOOGLE了,但与一些邮件的东西,而不是走了过来。
基本上,我需要创建一个Java代理服务器,这是由https.proxyPort
和https.proxyHost
标志设置到客户端,并且可以将数据发送回客户端应用程序,这可能不以任何方式被修改(它只是用URL connection = new URL("https://...")
)
几个我试过的网站...
- creating a Java Proxy Server that accepts HTTPS
- http://stilius.net/java/java_ssl.php
- 还有一件事让Java接受所有证书,但我找不到任何链接。我有代码,但我遇到了比我现在正在做的事情更多的错误,但如果有帮助,我可以包括它(我最初并不是因为这已经是一个长期问题了)
目前我还设置了系统属性https.proxyHost挣扎。通过将调试器附加到VM进程,似乎虚拟机根本没有拿起https.proxyHost属性。 – 2014-04-30 10:51:04
好的,只需使用proxyHost和proxyPort而不使用http。或https。前缀现在适合我。它也似乎是(再一次)从Java 6到Java 7的行为。从appleis到Java 7的上述语句。 – 2014-04-30 12:57:21
当通过代理请求https URL时,客户端必须请求'CONNECT www.google.ca:443 HTTP/1.0'和代理服务器响应'HTTP/1.0 200连接建立',两者都是纯文本格式。然后客户端开始SSL握手。 – auntyellow 2014-11-26 13:27:15