2009-05-15 7 views
13

Idealnie, potrzebuję tylko prostego SSLSocketChannel.SSL i SocketChannel

Mam już komponent, który czyta i pisze wiadomość ponad zwykłym SocketChannel, ale dla niektórych z tych połączeń muszę używać protokołu SSL przez przewód; operacje na tych połączeniach są jednak takie same.

Czy ktoś wie, darmową implementację SSLSocketChannel (z odpowiednim selektorem) lub coś podobnego? Znalazłem this, ale selektor go nie akceptuje, ponieważ jego dostawca nie jest SUN.

Odłączam logikę reading_from/write_to net od wstawiania i pobierania danych sieciowych za pomocą prostego obiektu, aby użyć SSLEngine bez wściekłości, ale jest to naprawdę trudne do prawidłowego wdrożenia, biorąc pod uwagę fakt, że Nie znam ustawień protokołu SSL ...

Odpowiedz

0

Sprawdź implementację Restletu, może zrobić to, czego potrzebujesz, a wszystko zależy od NIO.

Restlet Engine Javadoc

W szczególności, HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel zwraca ReadableByteChannel (getEntityChannel zwraca WriteableByteChannel)

+0

Dzięki, dam to to spojrzenie :) – akappa

+0

Mmh, przeszukałem źródła "SSLEngine" i znalazłem coś ... może nie korzystają z niezablokowanych I/O z SSL? – akappa

+0

Wątpię - cały projekt Restlet oparty jest na NIO. Niestety, nie mogę pomóc, ale muszę uwierzyć, że gdzieś tam jest dostępne rozwiązanie NIO SSL. – Gandalf

0

Nie jestem pewien, czy tego właśnie szukasz, ale może ci to pomóc ... Aby utworzyć gniazda serwerów z obsługą SSL/TLS, obecnie używam kodu podobnie jak poniżej (plik keystore.jks zawiera samodzielnie podpisaną parę kluczy prywatnych/publicznych służącą do zabezpieczania potwierdzenia) - klienci mają podobny magazyn zaufanych certyfikatów, który zawiera podpisany certyfikat z kluczem publicznym tej pary.

Trochę googlowania wokół uzyskania skonfigurowanej konfiguracji powinno spowodować rozpoczęcie pracy.

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

Być może nie wynika to z pytania, ale mam komponent, który nie blokuje operacji we/wy, więc chcę mieć niezablokowane gniazdo SSL (w Javie, nie blokujące gniazdo nazywa się "kanałem"). Dzięki swojemu podejściu masz blokujący Socket, który szyfruje dane przez SSL/TLS, więc nie jest to tym, czego szukam. Używam tego podejścia w innym komponencie, w którym mogę sobie pozwolić na narzut, aby mieć jeden wątek na połączenie. Dzięki dla ciebie czas! – akappa

+0

Ostatnio patrzyłem na coś podobnego, a ostatecznie decydujące narzędzia takie jak http://www.jboss.org/netty i http://mina.apache.org były o wiele prostsze w dodawaniu SSL do NIO. Istnieją mechanizmy korzystania z NIO za pomocą mechanizmu SSL, który można uzyskać z SSLContext, ale patrząc na przykładowy kod, który jest dostępny, jest po prostu zbyt cholernie trudny! [Zasada jest taka, że ​​jeśli potrzebuję pobrać ZIP kodu źródłowego do samouczka (zamiast wyświetlać go w linii), czas szukać alternatyw ...] – Martin

5

Jetty ma implementację protokołu NIO SSL dla swojego serwera: SslSelectorChannelConnector. Możesz zerknąć na niego po szczegóły dotyczące jego działania.

Istnieje również stary (ale przyzwoity) artykuł z O'Reilly, który wyjaśnia szczegóły dotyczące NIO + SSL wraz z przykładowym kodem.

+1

Dzięki za sugestie :) Już znam artykuł O'Reilly, ale jest on zbyt uproszczony. Znalazłem bardzo dobry aluzję na temat budowania czegoś podobnego do SSLSocketChannel w książce Esmond Pitta "Fundamental Networking in Java", ale nadal jest to bolesne ** dostać to w sposób właściwy;) – akappa

1

TLS Channel to prosta biblioteka, która robi dokładnie to: owijania SSLContext (lub SSLEngine) i wystawiając interfejs ByteChannel, robi dźwiganie ciężarów wewnętrznie.

(Nota prawna: jestem głównym autorem biblioteki).