【发布时间】:2013-04-27 20:06:52
【问题描述】:
出于教育目的,我正在用 Java 编写一个简单的 HTTPS 代理程序。我的程序在端口(例如 7443)上侦听来自浏览器(例如 Firefox)的传入 HTTPS 请求,解析请求并将其转发到所需的目的地(例如 @987654321 @)。
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?
异常表示连接可以是纯文本的,但只有来自 Firefox 的 HTTPS 连接设置为使用此端口。我已经记录了 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
Firefox 正在谈论 palin-text,我认为 CONNECT 是一个 SOCKS 命令(不过我不确定),我没有在 Firefox 的 SOCKS 设置中设置任何内容。下面是火狐的代理设置截图:
我在这里错过了什么?!我需要做些什么才能使其与 Firefox 或任何其他浏览器一起使用?!
---------------------------------------------- -------------------------------------------
对于那些认为这是 another question 的副本并且已经在另一个问题中得到回答的人,我不得不说:是的,这两个问题都源于一个类似的问题,但引用问题中的唯一答案指向使用 SSL Sockets 被证明具有误导性并导致了这个新问题。因此,尽管他们针对的是类似的问题,但这个问题显示了解决问题的完全不同但误导性的路径,因此它可以为未来面临此类问题的人提供有用的指导。
【问题讨论】:
-
这不是引用问题的重复。这两个问题明显不同,在引用的问题中没有可接受的解决方案。
-
对于那些在这个线程中结束的人:您可能对 TheConstructor 的工作示例感兴趣:stackoverflow.com/questions/16351413/…