Hmm. I saw this from some googling I did on that particular message.
We generally control both ends of the communication within our product
so I had assumed the handshake would negotiate this automatically.
>From a wireshark trace of the same test over the wire, I saw a huge
list of cipher-suites proposed to the other end (in fact, if you
decode those 100 bytes, I beleive that's what you see in the
messageSent log from my test).
/**
* Sets the list of cipher suites to be enabled when [EMAIL PROTECTED]
SSLEngine}
* is initialized.
*
* @param cipherSuites <tt>null</tt> means 'use [EMAIL PROTECTED]
SSLEngine}'s default.'
*/
public void setEnabledCipherSuites(String[] cipherSuites) {
this.enabledCipherSuites = cipherSuites;
}
Just for kicks, I tried "setEnabledCipherSuites(null);" but with no
change in behavior....
On Fri, Mar 7, 2008 at 10:12 AM, Niklas Therning <[EMAIL PROTECTED]> wrote:
> I think it is the "no cipher suites in common" error which causes the
> handshake problem. You can use SslFilter.setEnabledCipherSuites() to
> specify which suites should be enabled.
>
> HTH
>
> /Niklas
>
> Mark Renouf skrev:
>
>
> > I've been struggling with an SSL issue. I had it all working but I've
> > lost track of some changes and basically I'm stuck again. I've
> > dissolved it down to a unit test where I have a pair of VmPipe
> > (acceptor/connector) talking, each with an SslFilter. Each have a
> > seperate keystore, and a common truststore. Each's certificates are
> > signed by a CA cert in the trust store. These are known-good as they
> > were take from a production server.
> >
> > The server has a simple handler set which waits for "PING" and sends
> > back "PONG". The test passes without the SSL Filter in place. In the
> > tests I also placed a logging filter last on the filter chain of the
> > connector so I can see the raw data after processing.
> >
> > When I enable SSL on both ends, I get a failed handshake. I'm using
> > SSLContextFactory and KeyStoreFactory to load keystores. I've
> > independently verified the keystores are valid and being loaded
> > correctly (right passwords etc).
> >
> > The com.XXXXX.XXXXX lines below are just package names from an
> > unreleased product of my employer which I've anonymized for now :-)
> >
> > The handlers look like this:
> > IoHandler clientHandler = new IoHandlerAdapter() {
> > @Override
> > public void exceptionCaught(IoSession session, Throwable
> > cause) throws Exception {
> > LOGGER.fatal("CLIENT IoHandler: exceptionCaught", cause);
> > }
> > };
> >
> > IoHandler serverHandler = new IoHandlerAdapter() {
> > @Override
> > public void exceptionCaught(IoSession session, Throwable
> > cause) throws Exception {
> > LOGGER.fatal("SERVER IoHandler: exceptionCaught", cause);
> > session.close(true);
> > }
> >
> > @Override
> > public void messageReceived(IoSession session, Object
> > message) throws Exception {
> > if (message instanceof IoBuffer) {
> > String msg =
> > ((IoBuffer)message).getString(CHARSET.newDecoder());
> > if (msg.equals("PING")) {
> > IoBuffer buffer = IoBuffer.allocate(4);
> > buffer.putString("PONG", CHARSET.newEncoder());
> > buffer.flip();
> > session.write(buffer);
> > }
> > }
> > }
> > };
> >
> > There's also a LoggingFilter attached with the messageSent and
> > messageReceived levels visible (attached to the client's filter chain)
> >
> > Here is the relevant test code:
> >
> > Set up SSLContext ctx1 using SSLContextFactory....
> >
> > 171 IoAcceptor acceptor = new VmPipeAcceptor();
> > 172 acceptor.setHandler(serverHandler);
> > 173 SslFilter serverFilter = new SslFilter(ctx1);
> > 174 serverFilter.setNeedClientAuth(true);
> > 175 acceptor.getFilterChain().addLast("SSL", serverFilter);
> > 176 acceptor.bind(new VmPipeAddress(1));
> >
> > Set up SSLContext ctx2 using SSLContextFactory....
> >
> > 189 IoConnector connector = new VmPipeConnector();
> > 190 connector.setHandler(clientHandler);
> > 191 SslFilter clientFilter = new SslFilter(ctx2);
> > 192 clientFilter.setUseClientMode(true);
> > (Set up LoggingFilter)
> > 203 connector.getFilterChain().addLast("LOG", loggingFilter);
> > 204 connector.getFilterChain().addLast("SSL", clientFilter);
> >
> > Then:
> >
> > 206 ConnectFuture cf = connector.connect(new VmPipeAddress(1));
> > 207 cf.await();
> > 208 assertTrue(cf.isConnected());
> > 209 IoSession session = cf.getSession();
> > 210 session.getConfig().setUseReadOperation(true);
> > 211 IoBuffer buffer = IoBuffer.allocate(4);
> > 212 buffer.putString("PING", CHARSET.newEncoder());
> > 213 buffer.flip();
> > 214 WriteFuture wf = session.write(buffer);
> > 215 wf.await();
> > 216 assertTrue(wf.isWritten());
> > 217
> > 218
> > 219 ReadFuture rf = session.read();
> > 220 rf.await();
> > 221 assertTrue(rf.isRead());
> > 222 assertTrue(rf.getMessage() instanceof IoBuffer);
> > 223 IoBuffer buffer2 = (IoBuffer) rf.getMessage();
> > 224 assertEquals("PONG",
> buffer2.getString(CHARSET.newDecoder()));
> > 225 }
> >
> >
> > Here is the log output from the failing test case:
> >
> > 2008-03-07 09:21:47,597 INFO main SSLTestClient - SENT:
> > HeapBuffer[pos=0 lim=100 cap=130: 80 62 01 03 01 00 39 00 00 00 20 00
> > 00 04 01 00...]
> > 2008-03-07 09:21:47,602 FATAL main SSLTest - SERVER IoHandler:
> > exceptionCaught
> > javax.net.ssl.SSLHandshakeException: SSL handshake failed.
> > at
> org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:426)
> > at
> org.apache.mina.common.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:405)
> > at
> org.apache.mina.common.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:40)
> > at
> org.apache.mina.common.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:823)
> > at
> org.apache.mina.common.DefaultIoFilterChain$HeadFilter.messageReceived(DefaultIoFilterChain.java:607)
> > at
> org.apache.mina.common.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:405)
> > at
> org.apache.mina.common.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:399)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.fireEvent(VmPipeFilterChain.java:91)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.flushEvents(VmPipeFilterChain.java:75)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.pushEvent(VmPipeFilterChain.java:68)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.fireMessageReceived(VmPipeFilterChain.java:166)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain$VmPipeIoProcessor.updateTrafficMask(VmPipeFilterChain.java:239)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain$VmPipeIoProcessor.updateTrafficMask(VmPipeFilterChain.java:169)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.flushPendingDataQueues(VmPipeFilterChain.java:120)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.start(VmPipeFilterChain.java:62)
> > at
> org.apache.mina.transport.vmpipe.VmPipeConnector.connect0(VmPipeConnector.java:124)
> > at
> org.apache.mina.common.AbstractIoConnector.connect(AbstractIoConnector.java:167)
> > at
> org.apache.mina.common.AbstractIoConnector.connect(AbstractIoConnector.java:93)
> > at com.XXXXX.XXXXX.net.ssl.SSLTest.testSSLHandshake(SSLTest.java:206)
> > (junit code)
> > Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common
> > at
> com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Handshaker.java:997)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:459)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(SSLEngineImpl.java:1058)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(SSLEngineImpl.java:1030)
> > at javax.net.ssl.SSLEngine.wrap(SSLEngine.java:411)
> > at
> org.apache.mina.filter.ssl.SslHandler.handshake(SslHandler.java:477)
> > at
> org.apache.mina.filter.ssl.SslHandler.messageReceived(SslHandler.java:286)
> > at
> org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:407)
> > ... 40 more
> > Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common
> > at
> com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1356)
> > at
> com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:176)
> > at
> com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:164)
> > at
> com.sun.net.ssl.internal.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.java:639)
> > at
> com.sun.net.ssl.internal.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:450)
> > at
> com.sun.net.ssl.internal.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:178)
> > at
> com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
> > at com.sun.net.ssl.internal.ssl.Handshaker$1.run(Handshaker.java:437)
> > at java.security.AccessController.doPrivileged(Native Method)
> > at
> com.sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Handshaker.java:935)
> > at org.apache.mina.filter.ssl.SslHandler.doTasks(SslHandler.java:667)
> > at
> org.apache.mina.filter.ssl.SslHandler.handshake(SslHandler.java:458)
> > ... 42 more
> > 2008-03-07 09:21:47,607 INFO main SSLTestClient - RECEIVED:
> > HeapBuffer[pos=0 lim=7 cap=7: 15 03 01 00 02 02 28]
> > 2008-03-07 09:21:47,607 FATAL main SSLTest - CLIENT IoHandler:
> > exceptionCaught
> > javax.net.ssl.SSLHandshakeException: SSL handshake failed.
> > at
> org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:426)
> > at
> org.apache.mina.common.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:405)
> > at
> org.apache.mina.common.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:40)
> > at
> org.apache.mina.common.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:823)
> > at
> org.apache.mina.filter.logging.LoggingFilter.messageReceived(LoggingFilter.java:95)
> > at
> org.apache.mina.common.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:405)
> > at
> org.apache.mina.common.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:40)
> > at
> org.apache.mina.common.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:823)
> > at
> org.apache.mina.common.DefaultIoFilterChain$HeadFilter.messageReceived(DefaultIoFilterChain.java:607)
> > at
> org.apache.mina.common.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:405)
> > at
> org.apache.mina.common.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:399)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.fireEvent(VmPipeFilterChain.java:91)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.flushEvents(VmPipeFilterChain.java:75)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.pushEvent(VmPipeFilterChain.java:68)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.fireMessageReceived(VmPipeFilterChain.java:166)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain$VmPipeIoProcessor.flush(VmPipeFilterChain.java:192)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain$VmPipeIoProcessor.flush(VmPipeFilterChain.java:169)
> > at
> org.apache.mina.common.DefaultIoFilterChain$HeadFilter.filterWrite(DefaultIoFilterChain.java:644)
> > at
> org.apache.mina.common.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:467)
> > at
> org.apache.mina.common.DefaultIoFilterChain.access$1400(DefaultIoFilterChain.java:40)
> > at
> org.apache.mina.common.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:835)
> > at
> org.apache.mina.filter.ssl.SslHandler.flushScheduledEvents(SslHandler.java:260)
> > at
> org.apache.mina.filter.ssl.SslFilter.filterClose(SslFilter.java:581)
> > at
> org.apache.mina.common.DefaultIoFilterChain.callPreviousFilterClose(DefaultIoFilterChain.java:482)
> > at
> org.apache.mina.common.DefaultIoFilterChain.access$1500(DefaultIoFilterChain.java:40)
> > at
> org.apache.mina.common.DefaultIoFilterChain$EntryImpl$1.filterClose(DefaultIoFilterChain.java:840)
> > at
> org.apache.mina.common.DefaultIoFilterChain$TailFilter.filterClose(DefaultIoFilterChain.java:767)
> > at
> org.apache.mina.common.DefaultIoFilterChain.callPreviousFilterClose(DefaultIoFilterChain.java:482)
> > at
> org.apache.mina.common.DefaultIoFilterChain.fireFilterClose(DefaultIoFilterChain.java:477)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.fireEvent(VmPipeFilterChain.java:115)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.flushEvents(VmPipeFilterChain.java:75)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.pushEvent(VmPipeFilterChain.java:68)
> > at
> org.apache.mina.transport.vmpipe.VmPipeFilterChain.fireFilterClose(VmPipeFilterChain.java:126)
> > at
> org.apache.mina.common.AbstractIoSession.close(AbstractIoSession.java:173)
> > at
> org.apache.mina.common.AbstractIoSession.close(AbstractIoSession.java:158)
> > at com.XXXXX.XXXXX.net.ssl.SSLTest$2.exceptionCaught(SSLTest.java:95)
> > (stacktrace continues back into client here)
> >
> > Caused by: javax.net.ssl.SSLException: Received fatal alert:
> handshake_failure
> > at
> com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:166)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1356)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1324)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1486)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:961)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:787)
> > at
> com.sun.net.ssl.internal.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:663)
> > at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:566)
> > at org.apache.mina.filter.ssl.SslHandler.unwrap0(SslHandler.java:644)
> > at
> org.apache.mina.filter.ssl.SslHandler.unwrapHandshake(SslHandler.java:591)
> > at
> org.apache.mina.filter.ssl.SslHandler.handshake(SslHandler.java:461)
> > at
> org.apache.mina.filter.ssl.SslHandler.messageReceived(SslHandler.java:286)
> > at
> org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:407)
> > ... 90 more
> >
>
>