Есть ли способ использовать SSLContext с ServerSocketChannel?
У меня есть приложение, которое мне нужно использовать ServerSocketChannel
а также SocketChannel
внутри, но SSLContext
дает мне ServerSocketFactory
который дает ServerSocket
и принимает соединения в Socket
s.
Какие-либо решения? Спасибо
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 содержит ссылки от людей, которые делали примеры, но я сам на них не смотрел.