我正在制作一个依赖于设置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
and 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
andhttps.proxyHost
标志设置给客户端,并且可以将数据发送回客户端应用程序,它可能不会以任何方式修改(它只是使用URL connection = new URL("https://...")
)
我试过的几个网站...
- 创建一个接受 HTTPS 的 Java 代理服务器
- http://stilius.net/java/java_ssl.php
- 还有一些关于让 Java 接受所有证书的事情,但我找不到任何链接。我有代码,但我遇到的错误比我现在正在做的事情更多,但如果有帮助,我可以包括它(我最初没有,因为这已经是一个很长的问题)