我正在为教育目的用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