2012-02-02 15 views
10

¿Cómo aseguro un Java SocketChannel, ServerSocketChannel o, incluso, un DatagramChannel con TLS?Canales Java.nio y TLS

Sé que hay algunos marcos (#1#2) que anuncian poder, pero quiero saber si es posible lograr esto solo con la biblioteca estándar pura de Java.

+0

http://www.exampledepot.com/egs/javax.net.ssl/client.html –

+1

@MauricioLinhares: estos ejemplos son para 'SSLSocket's, no NIO. – Bruno

Respuesta

7

Debe usar SSLEngine y hacer el saludo manualmente usando esa máquina de estados. SSL/TLS se implementa sobre TCP para que no pueda usarlo directamente en la parte superior de DatagramChannel.

El artículo SSL with Java NIO puede ser útil.

+1

+1 Para sus enlaces también. Espero que no te importe, pero también agregaré el enlace Javadoc a mi respuesta. – Bruno

+0

+1 para el enlace del artículo –

16

Debe usar SSLEngine, como se documenta en Non-blocking I/O with SSLEngine. Las bibliotecas que mencionas lo usan o usan bibliotecas que lo usan.

(Tenga en cuenta que esto es muy difícil de usar.)

Usted puede encontrar estos enlaces interesantes:

  • This answer (que también contiene un enlace a un capítulo de un libro).
  • Notes from Jean-François Arcand quién lo implementó en Grizzly.
  • Un tipo de problemas que puede obtener con SSL/TLS asincrónico.
  • Familiarizarse con los problemas mencionados en estos this question también debería ser relevante (en particular, cómo tratar con ellos en modo asíncrono).
  • El Simple Framework también tiene soporte para async SSL/TLS.

para datagramas, usted debe buscar en el uso de DTLS en lugar de TLS. No estoy seguro de su estado de implementación en Java, pero podría buscar en los archivos de la lista de correo java.openjdk.security.devel.

+0

+1 Gracias por un buen enlace. – Jonas

+0

Tenga en cuenta que Grizzly se mudó: https://javaee.github.io/grizzly/ – mlohbihler

1

Como Bruno menciona correctamente, la forma estándar de hacerlo es utilizando SSLEngine. Pero esa clase es seriamente difícil de usar.

Me encontré con el mismo problema hace algún tiempo y terminé escribiendo mi propia biblioteca. Hay algunos ejemplos y, por supuesto, también está el código dentro de proyectos como Netty, etc. Pero ninguna de las opciones es sólida ni se puede reutilizar fácilmente.

TLS Channel envuelve un SSLEngine en un ByteBuffer y permite usarlo como los SocketChannels normales.

+1

¡Buen trabajo! muy buen proyecto. – dorony

+0

¡Agradable! ¿Algún plan para admitir AsynchronousSocketChannel en esa biblioteca? – jyemin

+0

@jyemin, parece posible y debería ser posible como una capa adicional sobre la interfaz existente.De alguna manera tendríamos que ajustar un bucle selector [como el que ya tenemos como prueba] (https://github.com/marianobarrios/tls-channel/blob/master/src/test/scala/tlschannel/helpers/NonBlockingLoops .scala). ¡Solicitudes de extracción bienvenidas! :-) –