2012-02-02 77 views
10

如何使用TLS保護Java SocketChannelServerSocketChannel或者甚至可以保護DatagramChannelJava.nio頻道和TLS

我知道有一些框架(#1#2)宣傳是可以的,但我想知道是否有可能通過純Java標準庫來實現這一目標。

+0

http://www.exampledepot.com/egs/javax.net.ssl/client.html – 2012-02-02 19:09:39

+1

@MauricioLinhares:這些例子適用於'SSLSocket's,而不是NIO。 – Bruno 2012-02-02 19:43:07

回答

7

您需要使用SSLEngine並使用該狀態機手動執行握手。 SSL/TLS在TCP之上實現,因此您不能直接在DatagramChannel上使用它。

該文章SSL with Java NIO可能會有所幫助。

+1

+1也適用於您的鏈接。我希望你不介意,但我也會將Javadoc鏈接添加到我的答案中。 – Bruno 2012-02-02 19:38:20

+0

+1文章鏈接 – 2012-10-09 13:56:31

16

您需要使用SSLEngine,如Non-blocking I/O with SSLEngine中所述。你提到的庫使用它或使用它的庫。

(注意,這是非常困難的使用。)

你可能會發現這些鏈接有趣:


數據報,你應該考慮使用DTLS而非TLS。我不確定它在Java中的實現狀態,但是你可以深入瞭解java.openjdk.security.devel郵件列表的檔案。

+0

+1感謝您的好鏈接。 – Jonas 2012-02-02 19:21:48

+0

請注意,灰熊已經移動:https://javaee.github.io/grizzly/ – mlohbihler 2017-06-15 13:20:20

1

正如Bruno正確地提到的那樣,標準的做法是使用SSLEngine。但是那個級別的認真很難使用。

前段時間我遇到了同樣的問題,最後寫了我自己的庫。這裏有一些例子,當然也有像Netty這樣的項目中的代碼等等。但是這兩個選項都不健壯或不易重複使用。

TLS Channel將SSLEngine包裝在ByteBuffer中,並允許像使用普通SocketChannels一樣使用它。

+1

幹得好!非常好的項目。 – dorony 2017-09-19 14:41:33

+0

不錯!任何計劃在該庫中支持AsynchronousSocketChannel? – jyemin 2018-01-05 16:17:55

+0

@jyemin,似乎是可行的,應該可能只是作爲現有接口之上的附加層。不知何故,我們需要包裝一個選擇器循環[就像我們已經作爲一個測試](https://github.com/marianobarrios/tls-channel/blob/master/src/test/scala/tlschannel/helpers/NonBlockingLoops .scala)。拉請求歡迎! :-) – 2018-01-05 22:54:18