Tworzyłem aplikację Java, która bazuje na ustawieniach http.proxyPort
i http.proxyHost
. Istnieją dwa procesy: jeden to zwykły program, drugi to proxy. Mam prosty detektor nasłuchujący działający pod numerem http.proxyPort
(który kontroluję). To tak proste, jakJava https proxy (przy użyciu https.proxyPort i https.proxyHost)
while (true) {
try {
Socket connection = server.accept();
Handler handler = new Handler(connection);
handler.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Więc kiedy "Proces 1" sprawia, że żądanie http - jak
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()));
to przechodzi przez pełnomocnika. Co się stanie, jeśli klient używa protokołu HTTPS? Jak zamiast tego użyj https://google.ca
? Istnieje własność https.proxyPort
i https.proxyHost
, ale dosłownie próbowałem przez wiele miesięcy (bez względu na to, czy to nie jest ważne) bez szczęścia. Przeczytałem kilka wątków (na koniec wymienię niektóre, więc wiesz, że coś zrobiłem).
Moja najbliższa próba tak daleko: Server
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();
}
I ten błąd javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
google go jednak wymyślił jakiegoś poczty zamiast rzeczy.
Zasadniczo, muszę stworzyć serwer java proxy, który jest nastawiony na klienta przez https.proxyPort
i https.proxyHost
flagi i może przesyłać dane z powrotem do aplikacji klienckiej, która nie może być w żaden sposób modyfikowane (nie jest to tylko przy użyciu URL connection = new URL("https://...")
)
kilka stron próbowałem ...
- creating a Java Proxy Server that accepts HTTPS
- http://stilius.net/java/java_ssl.php
- Było coś innego, jeśli chodzi o to, by Java akceptowała wszystkie certyfikaty, ale nie mogę znaleźć żadnego z nich. Mam kod, ale napotkałem więcej błędów niż to, co teraz robię, ale mogę je dołączyć, jeśli to pomaga (początkowo nie, ponieważ to już jest długie pytanie)
Obecnie jestem również zmaga się z ustawienie właściwości systemu https.proxyHost. Po podłączeniu debuggera do procesu VM wydaje się, że maszyna wirtualna w ogóle nie pobiera właściwości https.proxyHost. –
Ok, tylko za pomocą proxyHost i proxyPort bez http. lub https. Prefiks teraz działa dla mnie. Wygląda również na to, że zachowanie zostało (ponownie) przeniesione z Java 6 do Java 7. Instrukcja powyżej appleis do Javy 7. –
Gdy żądanie https URL przez proxy, klient musi zażądać 'CONNECT www.google.ca:443 HTTP/Odpowiedzi 1.0' i serwera proxy 'HTTP/1.0 200 Connection established', oba w trybie zwykłym. Następnie klient rozpoczyna uzgadnianie protokołu SSL. – auntyellow