使用Java实现简单的HTTPS代理应用程序?

时间:2013-05-03 12:07:53

标签: java ssl https proxy jsse

我正在编写一个带有Java的简单HTTPS代理程序用于教育目的。我的程序侦听来自浏览器(例如 Firefox )的传入HTTPS请求的端口(例如 7443 ),解析请求并将其转发到所需目的地(例如{{ 3}})。

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代理设置的屏幕截图:

Firefox Proxy Settings

我在这里想念的是什么?我需要做些什么来使用Firefox或任何其他浏览器?

----------------------------------------------- -------------------------------

对于那些认为这是https://www.comodo.com的副本并且已经在另一个中回答的人我不得不说:是的,这两个问题都源于类似的问题但是引用问题中的唯一答案指示使用SSL套接字,这被证明是误导性的,并导致了这个新问题。因此,虽然它们针对的是类似的问题,但这个问题显示了解决问题的完全不同但又误导的路径,因此它可以为面临此类问题的未来人员提供有用的指导。

2 个答案:

答案 0 :(得分:6)

摆脱所有SSL。只需处理传入的CONNECT命令,与上游服务器建立明文连接,然后开始复制字节。浏览器和服务器将使用SSL,但您根本不需要。

答案 1 :(得分:3)

您的设置正在使用HTTP隧道,其中发送到代理的初始请求 SSL加密;由于启用SSL的套接字期望进行SSL握手,因此会引发异常。

  

在此机制中,客户端要求HTTP代理服务器转发   使用“CONNECT”HTTP连接到所需目标的TCP   方法。然后服务器继续代表进行连接   客户端。一旦服务器建立了连接,   代理服务器继续代理TCP流到和来自   客户。请注意,只有初始连接请求是HTTP - 之后   即,服务器只是代理已建立的TCP连接。

您可以在HTTP Tunneling wiki页面上阅读更多相关信息。要查看此操作,您可以启动netcat服务器并将Firefox代理设置为指向该端口:

nc -l 8000

现在在Firefox中键入https://www.google.com,并检查nc输出:

CONNECT www.google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) 
Proxy-Connection: keep-alive
Connection: keep-alive
Host: www.google.com

这完全是明文。下图演示了 Firefox 代理期望如何进行通信。

enter image description here