2009-05-15 29 views
13

Idealmente, solo necesito un simple SSLSocketChannel.SSL y SocketChannel

Ya tengo un componente que lee y escribe mensajes en el ordinario SocketChannel, pero para algunas de estas conexiones, tengo que usar SSL a través del cable; las operaciones sobre estas conexiones, sin embargo, son las mismas.

¿Alguien sabe una implementación gratuita SSLSocketChannel (con el selector apropiado) o algo similar? He encontrado this, pero el selector no lo acepta porque su proveedor no es SUN.

Estoy desacoplando la lógica de reading_from/writing_to net de la inserción y recuperación de datos de red a través de un objeto simple, para usar un SSLEngine sin enojarme, pero es realmente complicado implementarlo correctamente, dado el hecho de que No sé las partes internas del protocolo SSL ...

Respuesta

0

Mira la implementación de Restlet, puede hacer lo que necesites, y todo se trata de NIO.

Restlet Engine Javadoc

Específicamente la HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel devuelve un ReadableByteChannel (getEntityChannel devuelve un WriteableByteChannel)

+0

Gracias, lo daré un vistazo :) – akappa

+0

Mmh, he buscado fuentes para "SSLEngine" y descubrí algo en Ivent ... ¿quizás no usan E/S sin bloqueo con SSL? – akappa

+0

Lo dudo: todo el proyecto de Restlet se basa en NIO. Lo siento no puede ser más ayuda, pero tengo que creer que tienen una solución SSL de NIO allí en alguna parte. – Gandalf

0

No estoy seguro si esto es lo que está buscando, pero puede ayudar ... Para crear sockets de servidor SSL/TLS, actualmente estoy usando el código como el siguiente (keystore.jks contiene un par de claves privado/público autofirmado utilizado para asegurar la confirmación): los clientes tienen un almacén de confianza similar que contiene el certificado firmado con la clave pública de ese par.

Un poco de google para configurarlo debería ponerlo en marcha.

String keyStorePath = "keystore.jks"; 
String keyStorePassword = "password"; 

KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
KeyStore keyStore = new KeyStore(); 
keyStore.load(new FileInputStream(keyStorePath), keyStorePassword); 
keyManagerFactory.init(keyStore, keyStorePassword.toCharArray()); 

sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); 

SSLContext sslContext = getServerSSLContext(namespace.getUuid()); 
SSLServerSocketFactory serverSocketFactory = sslContext.getServerSocketFactory(); 

// Create sockets as necessary 
+3

Quizás no esté claro a partir de la pregunta, pero tengo un componente que no bloquea E/S, por lo que quiero un socket SSL sin bloqueo (en Java, un socket que no se bloquea se llama "channel"). Con su enfoque, tiene un Socket de bloqueo que encripta los datos a través de SSL/TLS, por lo que no es lo que estoy buscando. Utilizo ese enfoque en otro componente, donde puedo permitir que la sobrecarga tenga un hilo por conexión. ¡Gracias de todos modos por su tiempo! – akappa

+0

He visto hacer algo similar hace poco, y en realidad terminé decidiendo que herramientas como http://www.jboss.org/netty y http://mina.apache.org eran un enfoque mucho más fácil para agregar SSL a NIO. Existen mecanismos para utilizar NIO a través del motor SSL que puede obtener de SSLContext, pero mirando el código de muestra que está disponible, ¡es demasiado duro! [Mi regla de oro es que si necesito descargar un código postal de un código fuente para un tutorial (en lugar de mostrarlo en línea) es hora de buscar alternativas ...] – Martin

5

embarcadero tiene una implementación NIO SSL para su servidor: SslSelectorChannelConnector. Es posible que desee echar un vistazo a él para obtener detalles sobre lo que está haciendo.

También hay un artículo antiguo (pero decente) de O'Reilly que explica los detalles sobre NIO + SSL junto con el código de ejemplo.

+1

Gracias por las sugerencias :) Ya conozco el artículo de O'Reilly, pero es un poco demasiado simple. He encontrado una muy buena sugerencia sobre cómo construir algo similar a un SSLSocketChannel en el libro de Esmond Pitt "Fundamental Networking in Java", pero todavía es un dolor en el ** consígalo correccionalmente;) – akappa

1

TLS Channel es una biblioteca simple que hace exactamente eso: envolver un SSLContext (o SSLEngine) y exponiendo una interfaz ByteChannel, haciendo el trabajo pesado internamente.

(Descargo de responsabilidad: soy el autor principal de la biblioteca).