Hi java-core community, I have been directed to this channel to discuss matters related to Java performant ssl communications. Maybe this is a topic that has been discussed in the past, in which case I would appreciate if someone pointed me to that particular topic.
Back in 2002 I personally applauded the java.nio.channels (jdk1.4) package, realizing that there was no way to port this to the secure communications, due to lack of a comparable implementation for SSL. But I thought it was going to just be matter of time. A couple of years ago I had to go back search for it, and was kind of surprised to find the following in http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#SSLENG : --- begin quote --- Newcomers to the API may wonder "Why not just have an SSLSocketChannel which extends java.nio.channels.SocketChannel?" There are two main reasons: 1. There were a lot of very difficult questions about what a SSLSocketChannel should be, including its class hierarchy and how it should interoperate with Selectors and other types of SocketChannels. Each proposal brought up more questions than answers. It was noted that any new API abstraction extended to work with SSL/TLS would require the same significant analysis and could result in large and complex APIs. 2. Any JSSE implementation of a new API would be free to choose the "best" I/O & compute strategy, but hiding any of these details is inappropriate for those applications needing full control. Any specific implementation would be inappropriate for some application segment. --- end quote --- It has been a while since this was stated, and I would really like to revisit it. I personally believe that the question #1 has a quite natural answer, while #2 should not really be a concern if we adhere to the spi model where users can bring their own implementation if needed. I know because I have also implemented it (but would like to discuss that in a later stage, if it comes to it). The benefit of such implementation would be immense. Imagine many Java services written with nio and which struggle to move to SSL due to the great complexity of using SSLEngine (zookeeper service to name one), while all they would need to do (if SSLSocketChannels were available) is to instantiate an instance of SSLSocketChannel/SSLSelector when the security is required and the rest would stay the same (as in case of plain communication using SocketChannel/Selector). Another important use case is the advent of IOT, where millions of devices, with relatively low throughput would want to protect their communication via SSL. The ways I have seen the community deal with this are mainly: 1. Go through the pain of learning SSLEngine (and hope to get it right) 2. Build their services around tested libraries (like Jetty, which handle the SSL offload but don't resurface it in SocketChannel/Selector paradigm, that also come with their huge set of dependencies, bringing in unavoidable version collisions) 3. Use proxies (nginx, ha) to deal with the high number of SSL connections and divide the load by scaling horizontally in the back end (making for a harder deployment model) We can make this a lot easier! Any feedback is greatly appreciated, Best, Andi Mullaraj