Каналы Java.nio и TLS

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

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

Ответ 1

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

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

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

  • Этот ответ (который также содержит ссылку на книгу).
  • Заметки от Jean-François Arcand, которые внедрили его в Grizzly.
  • пример типа проблем, которые вы можете получить с асинхронным SSL/TLS.
  • Знакомство с проблемами, упомянутыми в этих этом вопросе, также должно быть релевантным (в частности, как справиться с ними в асинхронном режиме).
  • Simple Framework также поддерживает асинхронный SSL/TLS.

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

Ответ 2

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

Может оказаться полезным статья SSL с Java NIO.

Ответ 3

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

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

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