2012-03-24 9 views
7

私はJettyのProxyServletをHTTPプロキシとして使用しています。SSLをサポートするJetty ProxyServlet

私はサーバーを起動し、firefoxでsocksプロキシを追加した後、問題なくプロキシ経由でWebサイトにアクセスできます。

問題は、プロキシを介してHTTPS Webサイトにアクセスしようとするときです。 Firefoxで「サーバーが見つかりません」というエラーが表示され、デバッグ中にJavaコードで何も起こりません。

JettyにSSLサポートを追加するには、ここで何か不足していますか?

は、ここでは、コードの一部です:

Server httpProxy = new Server(8087); 

    ServletHandler servletHandler = new ServletHandler(); 
    servletHandler.addServletWithMapping(new ServletHolder(new TunnelProxyServlet()), "/*"); 

    httpProxy.setHandler(servletHandler); 
    try { 
     httpProxy.start(); 
    } catch (Exception ex) { 
     Logger.getLogger(HttpProxy.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    public class TunnelProxyServlet extends ProxyServlet { 
     @Override 
     public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
     System.out.println("init done !"); 
     } 

     @Override 
     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { 
     System.out.println("got a request !"); 
     super.service(req, res); 
     } 
    } 

答えて

4

あなたが "ConnectHandler" を使用することができ

http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.jetty/example-jetty-embedded/8.1.1.v20120215/org/eclipse/jetty/embedded/ProxyServer.java

public class ProxyServer { 

    public static void main(String[] args) throws Exception { 

     Server server = new Server(); 
     SelectChannelConnector connector = new SelectChannelConnector(); 
     connector.setPort(8888); 
     server.addConnector(connector); 

     HandlerCollection handlers = new HandlerCollection(); 
     server.setHandler(handlers); 

     // Setup proxy servlet 
     ServletContextHandler context = new ServletContextHandler(handlers, "/", ServletContextHandler.SESSIONS); 
     ServletHolder proxyServlet = new ServletHolder(ProxyServlet.class); 
     proxyServlet.setInitParameter("whiteList", "google.com, www.eclipse.org, localhost"); 
     proxyServlet.setInitParameter("blackList", "google.com/calendar/*, www.eclipse.org/committers/"); 
     context.addServlet(proxyServlet, "/*"); 

     // Setup proxy handler to handle CONNECT methods 
     ConnectHandler proxy = new ConnectHandler(); 
     proxy.setWhite(new String[]{"mail.google.com"}); 
     proxy.addWhite("www.google.com"); 
     handlers.addHandler(proxy); 

     server.start(); 

    } 

} 
10

ZMKの答えは単純桟橋リポジトリから例のコピーであるとい仕事していない。

デフォルトでは、JettyにはHTTPSプロキシがありません。 AsyncProxyServletおよびProxyServletクラスは、HTTPプロキシだけを処理します。

  1. AsyncProxyServletクラスから継承するクラスを作成します。
  2. createHttpClient()メソッドをオーバーライドします。ここで重要な点は、作成するHttpClientインスタンスにSslContextFactory()が必要であることです。 HttpClientオブジェクトの適切な設定でSslContextFactoryを設定すれば、あなたはうまくいくでしょう。

ここでは詳細にコードの例です: https://github.com/k2k2e6/jettyHttpsProxy

3

私は現在、桟橋の最新リリース(9.4.1)を使用していると私は、HTTPSプロキシは、単に私にこれを追加することで作業を取得することができましたプロキシサーブレット:私はちょうど全体の代わりにcreateHttpClient()メソッドのこの単純なメソッドをオーバーライドする可能性が実現する前に開始したk2k2e6の例に

@Override 
protected HttpClient newHttpClient() {   
    return new HttpClient(new SslContextFactory()); 
} 

クレジット。

+0

新しいSslContextFactory()を直接渡すと、HttpClientコンストラクタが適切なxml設定ファイルなしで動作しなくなります。 setTrustAll(true)または新しいSslContextFactory(true)を使用することにより、特別な設定なしで動作します。しかし、それは盲目的にすべての証明書を信頼するため、大きなセキュリティ上の欠陥です。 –

関連する問題