我正在爲教育目的用Java編寫一個簡單的HTTPS代理程序。我的程序在端口(例如)上偵聽來自瀏覽器的傳入HTTPS請求(如Firefox),解析請求並將其轉發到所需目標(如https://www.comodo.com)。用Java實現簡單的HTTPS代理應用程序?
Firefox的代理設置被設置爲使用我的端口進行SSL連接(127.0.0.1 : 7443
)。
我的代碼很簡短:
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);
}
但是我趕上了以下異常:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
例外說,連接可以是純文本,但只有HTTPS連接從Firefox設置爲使用此端口。我已經記錄了哪些Firefox是發送到我的應用程序,它是這樣的:
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
火狐在談論佩林文本,我認爲CONNECT
是SOCKS命令(我不知道雖然),在那裏我有沒有在Firefox的SOCKS設置中設置任何內容。下面是Firefox的代理設置截圖:
缺少什麼我在這裏?!我需要做什麼才能使這個工作與Firefox或任何其他瀏覽器?!
---------------------------------------------- --------------------------------
對於那些認爲這是another question的重複,並且它有在另一個我不得不說的問題上得到了回答:是的,這兩個問題都有類似問題的根源,但是引用問題中的唯一答案指向使用SSL套接字,結果導致這個新問題。因此,儘管這些問題針對的是類似的問題,但這個問題表明瞭解決問題的完全不同而又誤導的路徑,因此它可以爲將來面臨這樣一個問題的人們提供有用的指導。
這不是所引用問題的重複。這兩個問題明顯不同,在引用的問題中沒有可接受的解決方案。 – 2013-05-05 11:03:17
對於那些最終在這個線程中的人:您可能對_TheConstructor_的工作示例感興趣:http://stackoverflow.com/questions/16351413/java-https-proxy-using-https-proxyport-and-https-代理主機 – Trinimon 2015-12-04 15:35:15