我正在编写一个简单的Java HTTPS代理程序,用于教育目的。我的程序侦听端口(例如 7443)以接收来自浏览器(例如 Firefox )的HTTPS请求,解析请求并将其转发到所需的目标(例如https://www.comodo.com)。Firefox的代理设置已设置为在SSL连接时使用我的端口(
异常消息表示连接可能是明文的,但仅限于从 Firefox 发出的 HTTPS 连接使用该端口。我已经记录了 Firefox 发送到我的应用程序的内容,如下所示:
火狐浏览器显示明文,我想
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
火狐浏览器显示明文,我想
CONNECT
是一个SOCKS命令(虽然我不确定),而我在火狐的SOCKS设置中没有设置任何内容。以下是火狐代理设置的屏幕截图:。我错过了什么?我需要做什么才能使它与Firefox或任何其他浏览器一起工作?对于那些认为这是另一个问题的重复,并且已经在其他问题中得到解答的人,我必须说:是的,这两个问题都源于类似的问题,但是引用问题中唯一的答案指向使用SSL套接字,这被证明是误导性的,并导致了这个新问题。因此,尽管它们旨在解决类似的问题,但这个问题展示了一个完全不同但误导性的解决问题的路径,因此它可能为未来面临这种问题的人提供有用的指导。