Каналы Java.nio и TLS

Как мне защитить Java SocketChannel, ServerSocketChannel или, возможно, даже DatagramChannel с помощью TLS?

Я знаю, что есть несколько фреймворков (# 1 # 2), которые рекламируют возможность, но я хочу знать, можно ли добиться этого с помощью одной только стандартной библиотеки Java.


person XZS    schedule 02.02.2012    source источник


Ответы (3)


Вам необходимо использовать SSLEngine, как описано в Неблокирующий ввод-вывод с SSLEngine. Упомянутые вами библиотеки используют его или используют библиотеки, которые его используют.

(Обратите внимание, что это, как известно, сложно использовать.)

Вы можете найти эти ссылки интересными:

  • Этот ответ (который также содержит ссылку на главу книги).
  • Заметки Жана-Франсуа Аркана, который реализовал его в Grizzly.
  • пример типа проблем, которые могут возникнуть при использовании асинхронного SSL / TLS.
  • Знакомство с проблемами, упомянутыми в этих этом вопросе, также должно быть актуальным (в частности, как решать их в асинхронном режиме. ).
  • Simple Framework также поддерживает асинхронный SSL / TLS.

Для дейтаграмм вам следует изучить использование DTLS вместо TLS. Я не уверен в статусе его реализации на Java, но вы можете покопаться в архивах списка рассылки java.openjdk.security.devel.

person Bruno    schedule 02.02.2012

Вам необходимо использовать SSLEngine и выполните рукопожатие вручную, используя этот конечный автомат. SSL / TLS реализован поверх TCP, поэтому вы не можете использовать его непосредственно поверх DatagramChannel.

Статья Неблокирующий ввод-вывод с SSLEngine может быть полезным.

person Jonas    schedule 02.02.2012
comment
Ссылка на Орейли мертва, кажется - person Pant; 06.08.2018

Как правильно отмечает Бруно, стандартный способ сделать это - использовать SSLEngine. Но этот класс серьезно трудно использовать.

Некоторое время назад я столкнулся с той же проблемой и в итоге написал свою собственную библиотеку. Есть несколько примеров и, конечно же, есть код внутри таких проектов, как Netty и т. Д. Но ни один из вариантов не является надежным или легко используемым повторно.

TLS Channel оборачивает SSLEngine в ByteBuffer и позволяет использовать его, как обычные SocketChannels.

person Mariano Barrios    schedule 22.07.2017
comment
Отлично! Есть ли планы по поддержке AsynchronousSocketChannel в этой библиотеке? - person jyemin; 05.01.2018
comment
@jyemin, кажется выполнимым и должен быть возможным как дополнительный слой поверх существующего интерфейса. Каким-то образом нам нужно обернуть цикл селектора как тот, который у нас уже есть в качестве теста. Запросы на вытягивание приветствуются! :-) - person Mariano Barrios; 06.01.2018
comment
@jyemin, надеюсь, еще не поздно, но последний выпуск Включена поддержка асинхронного канала. - person Mariano Barrios; 05.09.2018