我正在制作一个Java应用程序,它依赖于设置http.proxyPort
和http.proxyHost
。有两个进程:一个是常规程序,另一个是代理。我在http.proxyPort
上运行一个简单的套接字监听器(我可以控制)。就像这样:
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?
出现了错误,我查了一下,但是找到的都是关于邮件方面的东西。
基本上,我需要创建一个Java代理服务器,通过https。proxyPort
和https.proxyHost
标志设置给客户端,并且可以将数据发送回客户端应用程序,该应用程序可能无法以任何方式进行修改(只使用URL connection = new URL("https://...")
)
我尝试了几个网站...
- 创建接受HTTPS的Java代理服务器
- http://stilius.net/java/java_ssl.php
- 还有一些关于让Java接受所有证书的内容,但我找不到任何链接。我有代码,但我遇到了比我正在做的事情更多的错误,但如果可以的话我可以包含它(最初没有因为这已经是一个很长的问题)
CONNECT www.google.ca:443 HTTP/1.0
请求,并且代理服务器以明文方式响应HTTP/1.0 200 Connection established
。然后客户端开始SSL握手过程。 - auntyellow