Hi

Anyone got any idea as to how I could solve the issue I describe below? The MINA integration into FtpServer is not full functional, except for the SSL support :-/

Thanks!

/niklas

Niklas Gustavsson wrote:
Hi

I'm trying to integrate MINA with Apache FtpServer, basically base FtpServer's socket handling on MINA. So far it's been a great experience. However, I just got stuck. It might very likely be an error on my side but I need some pointers :-)

The FTP AUTH command is sent by a client to tell the server that it wants to secure the FTP control socket with SSL. The flow is like this:

1. Client sends "AUTH TLS"
2. Server sends "234 Command AUTH okay; starting TLS connection."
3. Server secures the socket
4. Next client call is over the secure socket

Now, to implement this I add a SSLFilter at step 3. However, I seem to run into a condition where the response sent at step 2 sometimes end up in the, not yet initialized, SSLFilter. This results in:
java.lang.IllegalStateException
at org.apache.mina.filter.SSLFilter.getSSLSessionHandler(SSLFilter.java:634) at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:371) at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:362) at org.apache.mina.common.support.AbstractIoFilterChain.access$1200(AbstractIoFilterChain.java:54) at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:800) at org.apache.mina.common.support.AbstractIoFilterChain$HeadFilter.messageReceived(AbstractIoFilterChain.java:617) at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain..java:362) at org.apache.mina.common.support.AbstractIoFilterChain.fireMessageReceived(AbstractIoFilterChain.java:353) at org.apache.mina.transport.socket.nio.SocketIoProcessor.read(SocketIoProcessor.java:281) at org.apache.mina.transport.socket.nio.SocketIoProcessor.process(SocketIoProcessor.java:241) at org.apache.mina.transport.socket.nio.SocketIoProcessor.access$500(SocketIoProcessor.java:44) at org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:559) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:43)
    at java.lang.Thread.run(Thread.java:595)


From my understanding, the response should already has been sent to the client but that seems not to be the case. The response (step 2) is sent as:
session.write(response).join();

Shouldn't the join() make that call wait until the write is completely done? If not, how would I otherwise ensure that the response has been sent before I add the SSL filter?

The full trace is attached.

Thanks!
/niklas


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

Server ready :: Apache FTP Server
------- Apache FTP Server started ------
[/127.0.0.1:2291] CREATED
Launching thread for /127.0.0.1:2291
[/127.0.0.1:2291] OPENED
[/127.0.0.1:2291] WRITE: 220 Service ready for new user.

< 220 Service ready for new user.
AUTH TLS
AUTH TLS

AUTH TLS

[/127.0.0.1:2291] RECEIVED: AUTH TLS
[/127.0.0.1:2291] WRITE: 234 Command AUTH okay; starting TLS connection.

< 220 Service ready for new user.
234 Command AUTH okay; starting TLS connection.
[/127.0.0.1:2291]  doHandshake()
[/127.0.0.1:2291]   initialHandshakeStatus=NEED_UNWRAP
[/127.0.0.1:2291]  unwrapHandshake()
[/127.0.0.1:2291] inNetBuffer: java.nio.DirectByteBuffer[pos=0 lim=0 cap=16665] [/127.0.0.1:2291] appBuffer: java.nio.DirectByteBuffer[pos=0 lim=33330 cap=33330] [/127.0.0.1:2291] Unwrap res:Status = BUFFER_UNDERFLOW HandshakeStatus = NEED_UNWRAP
bytesConsumed = 0 bytesProduced = 0
[EMAIL PROTECTED]
[/127.0.0.1:2291] SENT: 220 Service ready for new user.

[/127.0.0.1:2291] SENT: 234 Command AUTH okay; starting TLS connection.

[/127.0.0.1:2291] EXCEPTION:
java.lang.IllegalStateException
at org.apache.mina.filter.SSLFilter.getSSLSessionHandler(SSLFilter.java:634) at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:371) at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:362) at org.apache.mina.common.support.AbstractIoFilterChain.access$1200(AbstractIoFilterChain.java:54) at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:800) at org.apache.mina.common.support.AbstractIoFilterChain$HeadFilter.messageReceived(AbstractIoFilterChain.java:617) at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:362) at org.apache.mina.common.support.AbstractIoFilterChain.fireMessageReceived(AbstractIoFilterChain.java:353) at org.apache.mina.transport.socket.nio.SocketIoProcessor.read(SocketIoProcessor.java:281) at org.apache.mina.transport.socket.nio.SocketIoProcessor.process(SocketIoProcessor.java:241) at org.apache.mina.transport.socket.nio.SocketIoProcessor.access$500(SocketIoProcessor.java:44) at org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:559) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:43)
    at java.lang.Thread.run(Thread.java:595)
[/127.0.0.1:2291] CLOSE
[/127.0.0.1:2291] write outNetBuffer: java.nio.DirectByteBuffer[pos=0 lim=7 cap=16665] [/127.0.0.1:2291] session write: DirectBuffer[pos=0 lim=7 cap=8: 15 03 01 00 02 01 00] [/127.0.0.1:2291] Data Read: [EMAIL PROTECTED] (DirectBuffer[pos=0 lim=7 cap=8192: 15 03 01 00 02 02 0A])
[/127.0.0.1:2291]  doHandshake()
[/127.0.0.1:2291]   initialHandshakeStatus=NEED_UNWRAP
[/127.0.0.1:2291]  unwrapHandshake()
[/127.0.0.1:2291] inNetBuffer: java.nio.DirectByteBuffer[pos=0 lim=7 cap=16665] [/127.0.0.1:2291] appBuffer: java.nio.DirectByteBuffer[pos=0 lim=33330 cap=33330]
[/127.0.0.1:2291] Unexpected exception from SSLEngine.closeInbound().
javax.net.ssl.SSLException: Inbound closed before receiving peer's close_notify: possible truncation attack? at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:166) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1352) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1320) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.closeInbound(SSLEngineImpl.java:1259) at org.apache.mina.filter.support.SSLHandler.destroy(SSLHandler.java:165)
    at org.apache.mina.filter.SSLFilter.sessionClosed(SSLFilter.java:358)
at org.apache.mina.common.support.AbstractIoFilterChain.callNextSessionClosed(AbstractIoFilterChain.java:321) at org.apache.mina.common.support.AbstractIoFilterChain.access$900(AbstractIoFilterChain.java:54) at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.sessionClosed(AbstractIoFilterChain.java:781) at org.apache.mina.common.support.AbstractIoFilterChain$HeadFilter.sessionClosed(AbstractIoFilterChain.java:599) at org.apache.mina.common.support.AbstractIoFilterChain.callNextSessionClosed(AbstractIoFilterChain.java:321) at org.apache.mina.common.support.AbstractIoFilterChain.fireSessionClosed(AbstractIoFilterChain.java:313) at org.apache.mina.common.support.IoServiceListenerSupport.fireSessionDestroyed(IoServiceListenerSupport.java:271) at org.apache.mina.transport.socket.nio.SocketIoProcessor.doRemove(SocketIoProcessor.java:225) at org.apache.mina.transport.socket.nio.SocketIoProcessor.access$700(SocketIoProcessor.java:44) at org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:563) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:43)
    at java.lang.Thread.run(Thread.java:595)
[/127.0.0.1:2291] EXCEPTION:
javax.net.ssl.SSLHandshakeException: Initial SSL handshake failed.
at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:424) at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:362) at org.apache.mina.common.support.AbstractIoFilterChain.access$1200(AbstractIoFilterChain.java:54) at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:800) at org.apache.mina.common.support.AbstractIoFilterChain$HeadFilter.messageReceived(AbstractIoFilterChain.java:617) at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:362) at org.apache.mina.common.support.AbstractIoFilterChain.fireMessageReceived(AbstractIoFilterChain.java:353) at org.apache.mina.transport.socket.nio.SocketIoProcessor.read(SocketIoProcessor.java:281) at org.apache.mina.transport.socket.nio.SocketIoProcessor.process(SocketIoProcessor.java:241) at org.apache.mina.transport.socket.nio.SocketIoProcessor.access$500(SocketIoProcessor.java:44) at org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:559) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:43)
    at java.lang.Thread.run(Thread.java:595)
Caused by: javax.net.ssl.SSLException: Received fatal alert: unexpected_message at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:166) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1352) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1320) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1482) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:957) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:782) at com.sun.net.ssl.internal.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:674)
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:566)
at org.apache.mina.filter.support.SSLHandler.unwrapHandshake(SSLHandler.java:677) at org.apache.mina.filter.support.SSLHandler.handshake(SSLHandler.java:494) at org.apache.mina.filter.support.SSLHandler.messageReceived(SSLHandler.java:293) at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:392)
    ... 12 more
[/127.0.0.1:2291] CLOSED
Exiting since queue is empty for /127.0.0.1:2291


Reply via email to