Есть ли способ использовать SSLContext с ServerSocketChannel?

У меня есть приложение, которое мне нужно использовать ServerSocketChannel а также SocketChannel внутри, но SSLContext дает мне ServerSocketFactory который дает ServerSocket и принимает соединения в Sockets.

Какие-либо решения? Спасибо

2 ответа

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

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

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

"Базовый" JSSE .getSocketFactory а также .getServerSocketFactory косвенно создать на стороне клиента SSLSocket, или же SSLServerSocket который в свою очередь создает на стороне сервера SSLSocket, который в любом случае подклассы Socket (с некоторыми добавленными методами) и управляет протоколом SSL/TLS и сетевым вводом-выводом в простом ожидаемом стиле, который является наиболее простым для (большинства) приложений.

Чтобы использовать каналы, вместо этого вы должны создать SSLEngine, который обрабатывает только протокол SSL/TLS, а не сетевой (или другой!) Ввод / вывод. Затем вы читаете и пишете SocketChannel Вы сами отправляете данные SSLEngine "обернул" и передал полученные данные в "распаковку".

Для обзора см. https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html котором есть частичный пример кода - для клиента; вам нужно изменить это, изменив setUseClientMode в false и не используя подсказку о идентичности. (Клиент SSL/TLS должен (кэшировать и) выбирать сохраненные сеансы по идентификатору сервера, но сервер просто использует сеанс, который он ранее назначил, и клиент запомнил.)

Тогда посмотрите Javadoc (с необычно подробным введением) для SSLEngine Класс на https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLEngine.html или в вашей любимой JDK/IDE.

Или пример Java SSLEngine содержит ссылки от людей, которые делали примеры, но я сам на них не смотрел.

Другие вопросы по тегам