On Tue, 2017-05-09 at 01:39 -0700, Gary Gregory wrote:
> On May 9, 2017 1:00 AM, "Oleg Kalnichevski" <[email protected]> wrote:
> 
> On Tue, 2017-05-09 at 00:21 -0700, Gary Gregory wrote:
> > Hi All,
> > 
> > We have a nice example in HttpCore for an HTTP reverse proxy here:
> > 
> > https://hc.apache.org/httpcomponents-core-4.4.x/httpcore-nio/exampl
> > es
> > /org/apache/http/examples/nio/NHttpReverseProxy.java
> > 
> > I've taken this example and morphed into a different beast. I am
> > wondering
> > how I can let each origin server client have its own SSLContext in
> > order
> > for me to given them different TrustStrategy implementations.
> > 
> > In our example, we set things up like this:
> > 
> >         final IOEventDispatch *connectingEventDispatch *= new
> > DefaultHttpClientIODispatch(
> >                 clientHandler, ConnectionConfig.DEFAULT);
> > 
> >         final IOEventDispatch listeningEventDispatch = new
> > DefaultHttpServerIODispatch(
> >                 serviceHandler, ConnectionConfig.DEFAULT);
> > 
> >         Thread t = new Thread(new Runnable() {
> > 
> >             public void run() {
> >                 try {
> >                     connectingIOReactor.execute(*connectingEventDis
> > pa
> > tch*);
> >                 } catch (InterruptedIOException ex) {
> >                     System.err.println("Interrupted");
> >                 } catch (IOException ex) {
> >                     ex.printStackTrace();
> >                 } finally {
> >                     try {
> >                         listeningIOReactor.shutdown();
> >                     } catch (IOException ex2) {
> >                         ex2.printStackTrace();
> >                     }
> >                 }
> >             }
> > 
> >         });
> >         t.start();
> > 
> > 
> > In my case I build the connectingEventDispatch with our lower-level
> > APIs in
> > order to pass in the SSLContext like this:
> > 
> > ConnectionConfig clientConnectionConfig = ConnectionConfig.DEFAULT;
> > IOEventDispatch *connectingEventDispatch *=
> >     clientSslContext == null ?
> >     new DefaultHttpClientIODispatch(clientHandler,
> > clientConnectionConfig)
> > :
> >     new DefaultHttpClientIODispatch(clientHandler,
> > *clientSslContext*,
> > clientConnectionConfig);
> > 
> > But this SSLContext is used for ALL origin servers (a.k.a. target
> > hosts)
> > 
> > Do I need to build a connectingEventDispatch for each SSLContext I
> > need and
> > then execute each like the above:
> > 
> > connectingIOReactor.execute(connectingEventDispatch);
> > 
> > Each execute in its own thread?
> > 
> > Or is there a cleaner, more HttpCore way to do this?
> > 
> 
> I suppose the IOEventDispatch#onConnect would be the right place to
> implement TLS upgrade. One can employ various strategies here, for
> instance, passing some sort of config object as an attachment to the
> session request and building SSL context for the session based on
> that
> config.
> 
> 
> Hi Oleg,
> 
> I am not talking about upgrading connections, even though that would
> be
> nice but a separate topic. I
> 
> I know at startup whether I need SSL or not for each origin server
> and
> which TrustStrategy for origin server. I am wondering how to install
> a TS
> for each given origin server.


I am not sure I understand the problem you are having. One would set up
trust material when upgrading to SSL/TLS, wound not one?

---

class MyIODispatch extends AbstractIODispatch<DefaultNHttpClientConnection> {

    @Override
    protected DefaultNHttpClientConnection createConnection(final IOSession 
session) {

        InetSocketAddress remoteAddress = (InetSocketAddress) 
session.getRemoteAddress();
        if ("secure-origin".equalsIgnoreCase(remoteAddress.getHostName())) {

            SSLContext sslContext = SSLContextBuilder.create()
                    .loadTrustMaterial(new TrustStrategy() {
                        @Override
                        public boolean isTrusted(X509Certificate[] chain, 
String authType) throws CertificateException {
                            return true;
                        }
                    })
                    .build();
            SSLIOSession sslioSession = new SSLIOSession(session, 
SSLMode.CLIENT, sslContext, null);
            session.setAttribute(SSLIOSession.SESSION_KEY, sslioSession);
        }
        return new DefaultNHttpClientConnection(session, 8 * 1024);
    }
}
---

Oleg

> 
> It is still a little too early for me to port my app to 5.0 as I am
> still
> flushing out features. I certainly plan on doing that and helping
> with 5.0
> as much as I can.
> 
> Gary
> 
> 
> Oleg
> 
> PS: I hope that TLS upgrade APIs in 5.0 are much nicer.
> 
> 
> > Thank you!
> > Gary
> > 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to