2009-05-15 25 views
13

İdeal olarak, basit bir SSLSocketChannel'a ihtiyacım var.SSL ve SocketChannel

Zaten ileti alıp sıradan SocketChannel üzerinde yazan bir bileşene sahibim, ancak bu bağlantılardan bazıları için SSL üzerinden tel kullanmalıyım; Bununla birlikte, bu bağlantılar üzerindeki işlemler aynıdır.

Herkes ücretsiz SSLSocketChannel uygulamasını (uygun seçici ile) veya benzer bir şey biliyor mu? this'u buldum, ancak satıcısı SUN olmadığından seçiciyi kabul etmiyor.

SSLEngine'u kızmadan kullanabilmeniz için read_from/writing_to net mantığını basit bir nesne aracılığıyla ağ verilerinin eklenmesi ve alınmasından ayıracağım, ancak doğru bir şekilde uygulamak gerçekten doğru bir şeydir. SSL protokolünün iç yapısını bilmiyorum ...

cevap

0

Restlet'in uygulanmasına göz atın, ihtiyacınız olanı yapabilir ve her şey NIO ile ilgilidir.

Restlet Engine Javadoc

Özellikle HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel döndüren bir ReadableByteChannel (getEntityChannel bir WriteableByteChannel döndüren)

+0

Teşekkürler, vereceğim Bir bakış :) – akappa

+0

Mmh, "SSLEngine" için kaynaklarda arama yaptım ve bir şey bulamadık ... belki de SSL ile nonblocking I/O kullanmazlar? – akappa

+0

Şüpheliyim - tüm Restlet projesi NIO'ya dayanıyor. Maalesef daha fazla yardım olamaz, ancak bir yerlerde bir NIO SSL çözümü olduğuna inanıyorum. – Gandalf

0

Aradığınız şeyin bu olduğundan emin değil ama yardımcı olabilir ... SSL/TLS etkin sunucu soketleri oluşturmak için şu anda kod kullanıyorum Aşağıdaki gibi (keystore.jks, onaylama için kullanılan kendinden imzalı bir özel/ortak anahtar çifti içerir) - istemcilerin, söz konusu çiftin ortak anahtarıyla imzalı sertifikayı içeren benzer bir güven deposuna sahip olurlar.

Yapılandırılanı almanın etrafında biraz uğraşmanız sizi devam ettirmelidir.

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

Belki de bu sorudan net değil, ancak engellemeyen bir G/Ç yapan bir bileşenim var, bu yüzden engellemeyen bir SSL soketi istiyorum (Java'da, engelleme olmayan bir yuvaya "kanal" denir). Yaklaşımınız ile, verileri SSL/TLS üzerinden şifreleyen bir Engelleme Soketiniz var, bu yüzden aradığım şey değil. Bu yaklaşımı, başka bir bileşende kullanırım; bağlantı başına bir vida dişi almak için yükü karşılayabileceğim. Zaman ayırdığınız için teşekkürler! – akappa

+0

Son zamanlarda benzer bir şey yapmaya çalıştım ve aslında http://www.jboss.org/netty ve http://mina.apache.org gibi araçlara karar vermek, NIO'ya SSL eklemek için çok daha kolay bir yaklaşımdı. SSL Engine üzerinden NIO'yu SSLContext'ten alabileceğiniz, ancak mevcut örnek kodlara bakarak kullanabileceğiniz mekanizmalar var, bu çok zor! [Benim kural şudur: Eğer bir öğretici için bir kaynak kodun ZIP'i indirmem gerekirse (satır içi görüntülemek yerine) alternatifler aramanın zamanıdır ...] – Martin

5

Jetty'nin sunucuları için bir NIO SSL uygulaması vardır: SslSelectorChannelConnector. Ne yaptığını öğrenmek için ona göz atmak isteyebilirsiniz.

Ayrıca, O'Reilly'dan, örnek kodla birlikte NIO + SSL ile ilgili ayrıntıları açıklayan eski (ancak iyi) bir makale da vardır.

+1

Öneriler için teşekkürler :) Zaten O'Reilly makalesini biliyorum, ama biraz fazla basit. Esmond Pitt'in "Java'da Temel Ağ Oluşturma" kitabında bir SSLSocketChannel'e benzer bir şey oluşturmaya dair çok iyi bir ipucu buldum, ama yine de bir ** aleyhinde acı çekiyorum;) – akappa

1

TLS Channel tam olarak bunu yapıyor basit bir kütüphane: Bir SSLContext (veya SSLEngine) sararak ve ByteChannel arayüzü açığa, içten İşin büyük.

(Yasal Uyarı: Kitaplık ana yayıncılarıyım).