Ich schreibe ein einfaches HTTPS-Proxy-Programm mit Java für Bildungszwecke. Mein Programm hört auf einem Port (zB) nach eingehenden HTTPS-Anfragen von einem Browser (zB Firefox), analysiert die Anfrage und leitet sie an das gewünschte Ziel weiter (zB https://www.comodo.com).Implementierung einer einfachen HTTPS-Proxy-Anwendung mit Java?
Die Proxy-Einstellungen von Firefox sind so eingestellt, dass sie meinen Port für SSL-Verbindungen verwenden (127.0.0.1 : 7443
).
Mein Code ist kurz und einfach:
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);
}
Aber ich fange die folgende Ausnahme:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
Die Ausnahme besagt, dass die Verbindung Klartext sein könnte, aber nur HTTPS-Verbindungen von Firefox sind auf diesen Port eingestellt. Ich habe angemeldet, was Firefox meine Anwendung sendet, welche das ist:
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 spricht palin-Text, und ich denke, CONNECT
ist ein SOCKS-Befehl (ich bin aber nicht sicher), wo ich nicht Legen Sie alles in den SOCKS-Einstellungen von Firefox fest. Nachstehend ist ein Screenshot von Proxy-Einstellungen des Firefox:
Was ich hier fehlt?! Was muss ich tun, damit dies mit Firefox oder einem anderen Browser funktioniert?
---------------------------------------------- --------------------------------
Für diejenigen, die denken, dass dies ein Duplikat von another question ist und das es hat In der anderen Frage muss ich antworten: Ja, beide Fragen haben Wurzeln in einem ähnlichen Problem, aber die einzige Antwort in der zitierten Frage bezieht sich auf die Verwendung von SSL Sockets, die sich als irreführend herausstellte und zu dieser neuen Frage führte. Obwohl sie auf ein ähnliches Problem abzielen, zeigt diese Frage einen völlig anderen und doch irreführenden Weg zur Lösung des Problems und könnte somit eine nützliche Orientierungshilfe für zukünftige Personen sein, die sich mit einem solchen Problem konfrontiert sehen.
Dies ist kein Duplikat der genannten Frage. Die beiden Fragen sind eindeutig verschieden, und in der zitierten Frage gibt es keine akzeptable Lösung. –
Für diejenigen, die in diesem Thread gelandet sind: Sie könnten sich für das Arbeitsbeispiel von _TheConstructor_ interessieren: http://StackOverflow.com/Questions/16351413/Java-https-Proxy-using-https-Proxyport-und-https- proxyhost – Trinimon