2009-05-15 14 views
13

Idealerweise brauche ich nur eine einfache SSLSocketChannel.SSL und SocketChannel

Ich habe bereits eine Komponente, die Nachricht liest und schreibt über gewöhnliche SocketChannel, aber für einige dieser Verbindungen muss ich SSL über den Draht verwenden; Die Operationen über diese Verbindungen sind jedoch gleich.

Kennt jemand eine freie SSLSocketChannel Implementierung (mit dem entsprechenden Selektor) oder etwas ähnliches? Ich habe this gefunden, aber der Selektor akzeptiert es nicht, da sein Hersteller nicht SUN ist.

Ich entkopple die reading_from/write_to net Logik aus dem Einfügen und Abrufen von Netzwerkdaten über ein einfaches Objekt, um eine SSLEngine ohne verrückt zu werden, aber es ist wirklich schwierig, das richtig zu implementieren, angesichts der Tatsache, dass Ich kenne die Interna des SSL-Protokolls nicht ...

Antwort

0

Schauen Sie sich die Implementierung von Restlet an, es kann tun, was Sie brauchen, und alles dreht sich um NIO.

Restlet Engine Javadoc

Insbesondere die HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel gibt ein ReadableByteChannel (getEntityChannel gibt eine WriteableByteChannel)

+0

Danke, ich gebe es Ein Blick :) – akappa

+0

Mmh, ich habe in den Quellen nach "SSLEngine" gesucht und I'vent alles gefunden ... vielleicht verwenden sie nicht blockierende I/O mit SSL? – akappa

+0

Ich bezweifle es - das ganze Restlet-Projekt basiert auf NIO. Entschuldigung kann nicht mehr Hilfe sein, aber ich muss glauben, dass sie irgendwo eine NIO SSL-Lösung haben. – Gandalf

0

Nicht sicher, ob dies das ist, was Sie suchen, aber möglicherweise helfen ... Um SSL/TLS-fähige Server-Sockets zu erstellen, verwende ich derzeit Code wie folgt (keystore.jks enthält ein selbstsigniertes privates/öffentliches Schlüsselpaar, das zum Sichern der Bestätigung verwendet wird) - Clients haben einen ähnlichen Trust Store, der das signierte Zertifikat mit dem öffentlichen Schlüssel dieses Paares enthält.

Ein bisschen googlen um die Konfiguration zu bekommen sollte dich auf den Weg bringen.

+3

Vielleicht ist es nicht klar aus der Frage, aber ich habe eine Komponente, die nicht blockierende E/A, also ich möchte eine nicht blockierende SSL-Socket (in Java, eine nicht blockierende Socket heißt "Kanal"). Mit Ihrem Ansatz haben Sie einen blockierenden Socket, der die Daten über SSL/TLS verschlüsselt, also ist es nicht das, wonach ich suche. Ich benutze diesen Ansatz in einer anderen Komponente, wo ich mir den Overhead leisten kann, einen Thread pro Verbindung zu haben. Danke trotzdem für deine Zeit! – akappa

+0

Ich habe in letzter Zeit versucht, etwas Ähnliches zu tun, und tatsächlich entschied sich Tools wie http://www.jboss.org/netty und http://mina.apache.org waren ein viel einfacher Ansatz zum Hinzufügen von SSL zu NIO. Es gibt Mechanismen, NIO über die SSL-Engine zu verwenden, die Sie aus dem SSLContext erhalten können, aber wenn Sie sich den Beispielcode ansehen, der verfügbar ist, ist es einfach zu verdammt schwer! [Meine Faustregel lautet, dass es Zeit ist, nach Alternativen zu suchen, wenn ich einen ZIP-Quellcode für ein Tutorial herunterladen muss (anstatt es inline anzuzeigen).] – Martin

5

Jetty hat eine NIO SSL-Implementierung für ihren Server: SslSelectorChannelConnector. Vielleicht möchten Sie einen Blick darauf werfen, um Details zu erfahren.

Es gibt auch einen alten (aber anständigen) Artikel von O'Reilly, der die Details über NIO + SSL zusammen mit Beispielcode erklärt.

+1

Danke für die Vorschläge :) Ich kenne den O'Reilly Artikel schon, aber es ist ein bisschen zu simplistic. Ich habe einen sehr guten Hinweis darauf gefunden, etwas Ähnliches wie einen SSLSocketChannel in Esmond Pitts Buch "Fundamental Networking in Java" aufzubauen, aber es ist immer noch ein Schmerz in der a ** get correply;) – akappa

1

TLS Channel ist eine einfache Bibliothek, die das tut genau: Wickeln eines SSL-Kontext (oder SSLEngine) und eine ByteChannel Schnittstelle aussetzt, intern die schwere Arbeit zu tun.

(Disclaimer: Ich bin der Hauptautor der Bibliothek).