SSLException in SslHandler; based on SecureChat example

Trustin Lee tlee at redhat.com
Mon Apr 13 14:58:50 EDT 2009


Hi,

Thanks for the detailed problem report.  Fortunately, I experienced
the same issue and it was fixed in 3.1.0.ALPHA3 (or 2).  I just forgot
to log this change to the release note.  You can find it in SslHandler
changelog though:

http://fisheye.jboss.org/browse/Netty/trunk/src/main/java/org/jboss/netty/handler/ssl/SslHandler.java

Check the revision # around 496.

So, I'd suggest you to try 3.1.0.BETA1 meanwhile.  Let me know using
3.1.0.BETA1 fixes the problem.

HTH,

— Trustin Lee, http://gleamynode.net/



On Tue, Apr 14, 2009 at 1:56 AM, bwagner <bwagner at mpowertrading.com> wrote:
>
> N.B.  I forgot to mention that the exception is truly non-deterministic in behavior.  It will happen even after other client connections have been established.  Typically, launching the client application again will result in a successful connection.  The client-side handlers are also based on the examples and are highly symmetric with the server code.  I am using SecureKeyStore and SecureTrustManagerFactory from the example without any modifications.
>
> Client ChannelPipelineFactory:
>
>
> public class ClientNettyPipelineFactory implements ChannelPipelineFactory {
>
>        protected INettySocket nettySocket;  // the reference to the {@link INettySocket} instance
>
>        /**
>         * Creates a new {@link NettyPipelineFactory}.
>         * @param nettySocket the reference to the {@link INettySocket} instance
>         */
>        public ClientNettyPipelineFactory(INettySocket nettySocket) {
>                this.nettySocket = nettySocket;
>        }
>
>        public ChannelPipeline getPipeline() throws Exception {
>                ChannelPipeline channelPipeline = Channels.pipeline();
>
>                // Add SSL handler first to encrypt and decrypt everything.  In this example, we use a bogus certificate in the server side
>                // and accept any invalid certificates in the client side.  You will need something more complicated to identify both client
>                // and server in the real world.
>                SSLContext clientContext = SecureSslContextFactory.getClientContext();
>                SSLEngine  sslEngine     = clientContext.createSSLEngine();
>                sslEngine.setUseClientMode(true);
>                channelPipeline.addLast("ssl", new SslHandler(sslEngine));
>
>                // add object decoder/encoder
>                channelPipeline.addLast("decoder", new ObjectDecoder());
>                channelPipeline.addLast("encoder", new ObjectEncoder());
>
>                // create a new {@link ClientNettyHandler} instance for each new channel
>                NettyHandler nettyHandler = new ClientNettyHandler(this.nettySocket);
>                channelPipeline.addLast("handler", nettyHandler);
>
>                return channelPipeline;
>        }
> }
>
>
>
> Client SslContextFactory:
>
>
> public class SecureSslContextFactory {
>
>        private static final String PROTOCOL       = "TLS";
>        private static SSLContext   CLIENT_CONTEXT = null;
>        private static final Object LOCK           = new Object();
>
>        /**
>         * Creates the client SSL context.
>         */
>        private static void createClientInstance() {
>                SSLContext clientContext = null;
>                try {
>                        KeyManager[]   keyManagers   = null;
>                        TrustManager[] trustManagers = SecureTrustManagerFactory.getTrustManagers();
>                        SecureRandom   secureRandom  = null;
>                        clientContext                = SSLContext.getInstance(PROTOCOL);
>                        clientContext.init(keyManagers, trustManagers, secureRandom);
>                }
>                catch (Exception e) {
>                        throw new Error("Failed to initialize the client-side SSLContext", e);
>                }
>
>                CLIENT_CONTEXT = clientContext;
>                if (CLIENT_CONTEXT == null) {
>                        throw new Error("Failed to initialize the client-side SSLContext:  CLIENT_CONTEXT=" + CLIENT_CONTEXT);
>                }
>        }
>
>        /**
>         * Returns the singleton client-side SSL context.
>         * @return the singleton client-side SSL context
>         */
>        public static SSLContext getClientContext() {
>                if (CLIENT_CONTEXT == null) {
>                        synchronized (LOCK) {
>                                if (CLIENT_CONTEXT == null) {
>                                        createClientInstance();
>                                }
>                        }
>                }
>                return CLIENT_CONTEXT;
>        }
> }
>
>
>
> Relevent code from client Netty socket handler:
>
>
> public class ClientNettySocket implements INettySocket {
>
> ...
>
>        protected ExecutorService        bossExecutor;            // the main executor service for the Netty {@link ChannelFactory}
>        protected ExecutorService        workerExecutor;          // the auxiliary executor service for the Netty {@link ChannelFactory}
>        protected ChannelFactory         channelFactory;          // the Netty factory for creating {@link Channel} instances
>        protected ChannelPipelineFactory channelPipelineFactory;  // the factory used to bootstrap encoders and handlers with each {@link Channel} instance
>        protected ClientBootstrap        clientBootstrap;         // the Netty factory for bootstrapping {@link Channel} instances with the encoders and handlers of {@link NettyPipelineFactory}
>
>        /**
>         * Creates a new {@link ClientNettySocket}.
>         * @param sessionSocketListener the reference to the {@link ISessionSocketListener} to send session events to
>         */
>        public ClientNettySocket(ISessionSocketListener sessionSocketListener) {
>
>                SecureSslContextFactory.getClientContext();  // make sure the SSL context is cached
>
>                this.sessionSocketListener  = sessionSocketListener;
>                this.sessionChannel         = null;
>
>                this.bossExecutor           = Executors.newCachedThreadPool();
>                this.workerExecutor         = Executors.newCachedThreadPool();
>                this.channelFactory         = new NioClientSocketChannelFactory(bossExecutor, workerExecutor);
>                this.channelPipelineFactory = new ClientNettyPipelineFactory(this);
>                this.clientBootstrap        = new ClientBootstrap(channelFactory);
>
>                clientBootstrap.setPipelineFactory(channelPipelineFactory);
>                clientBootstrap.setOption("tcpNoDelay", true);
>                clientBootstrap.setOption("keepAlive",  true);
>        }
>
> ...
>
> }
>
> --
> View this message in context: http://n2.nabble.com/SSLException-in-SslHandler--based-on-SecureChat-example-tp2628574p2628633.html
> Sent from the Netty User Group mailing list archive at Nabble.com.
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
>




More information about the netty-users mailing list