Я создавал приложение 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();
}
Client
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://...")
)
Несколько сайтов, которые я пробовал...
- создание прокси-сервера Java, принимающего HTTPS
- http://stilius.net/java/java_ssl.php
- Было что-то еще в том, чтобы заставить Java принимать все сертификаты, но я не могу найти ни одной из ссылок. У меня есть код, но я столкнулся с большим количеством ошибок, чем то, что я делаю прямо сейчас, но я могу включить его, если это поможет (я не изначально, потому что это уже длинный вопрос).