Piszę prosty program proxy HTTPS z Javą do celów edukacyjnych. Mój program nasłuchuje na porcie (na przykład) dla przychodzących żądań HTTPS z przeglądarki (np. Firefox), analizuje żądanie i przekazuje je do wybranego miejsca docelowego (na przykład https://www.comodo.com).Wdrażanie prostej aplikacji Proxy HTTPS w Javie?
Ustawienia proxy Firefoksa służą do korzystania z mojego portu do połączeń SSL (127.0.0.1 : 7443
).
Mój kod jest krótka i prosta:
static // initializer
{
System.setProperty("javax.net.ssl.keyStore", "MyKeyStore");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
}
SSLServerSocketFactory ssFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
try {
SSLServerSocket listener = (SSLServerSocket) ssFactory.createServerSocket(port, 64);
listener.setUseClientMode(false);
listener.setWantClientAuth(false);
listener.setNeedClientAuth(false);
SSLSocket connection = (SSLSocket) listener.accept();
browser.startHandshake(); /* <<== Exception throws at this line */
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
Ale Łapię następujący wyjątek:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
Wyjątkiem mówi, że połączenie może być zwykły tekst, ale tylko połączeń HTTPS z Firefoxa są ustawione na używanie tego portu. Mam zalogowany co Firefox wysyła do mojej aplikacji, która jest taka:
CONNECT www.comodo.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: www.comodo.com
Firefox mówi Palin-tekst i myślę CONNECT
jest polecenie SOCKS (nie jestem pewien, choć), gdzie nie mam ustaw dowolne ustawienia SOCKS w Firefoksie. Poniżej znajduje się zrzut ekranu z ustawień proxy Firefoksa:
Co ja tu brakuje? Co muszę zrobić, aby działało to z przeglądarką Firefox lub inną przeglądarką?!
---------------------------------------------- --------------------------------
Dla tych, którzy myślą, że jest to duplikat another question i że ma na drugie pytanie mam do powiedzenia: tak, oba pytania mają korzenie w podobnym problemie, ale jedyna odpowiedź w cytowanym pytaniu dotyczy użycia gniazd SSL, które okazały się mylące i zaowocowały nowym pytaniem. Tak więc chociaż są one nakierowane na podobny problem, to pytanie pokazuje zupełnie inną, a jednak wprowadzającą w błąd ścieżkę do rozwiązania problemu, a zatem może dostarczyć użytecznych wskazówek dla przyszłych osób borykających się z takim problemem.
To nie jest duplikat cytowanego pytania. Te dwa pytania są wyraźnie różne i nie ma akceptowalnego rozwiązania w przywołanym pytaniu. –
Dla tych, którzy znaleźli się w tym wątku: możesz być zainteresowany przykładem pracy _TheConstructor_ tutaj: http://stackoverflow.com/questions/16351413/java-https-proxy-using-https-proxyport-and-https- proxyhost – Trinimon