У меня есть приложение, которое мне нужно использовать ServerSocketChannel
и SocketChannel
внутри, но SSLContext
дает мне ServerSocketFactory
, который дает ServerSocket
и принимает соединения в Socket
с.
Любые решения? БлагодаряМожно ли использовать SSLContext с ServerSocketChannel?
ответ
«основного» JSSE .getSocketFactory
и .getServerSocketFactory
косвенно создают на стороне клиента SSLSocket
или SSLServerSocket
, которые, в свою очередь, создает на стороне сервера SSLSocket
, что в любом случае подклассом Socket
(с некоторыми дополнительными методами) и управляет как SSL/TLS протокол и сетевой ввод-вывод в простом режиме ожидания, который является самым простым для (большинства) приложений.
Чтобы использовать каналы, вы должны вместо создания SSLEngine, который обрабатывает только SSL/TLS протокол и не сеть (или другой!) I/O. Затем вы сами читаете и записываете SocketChannel
, отправляя данные, SSLEngine
«обернул» и предоставил полученным данным «развернуть».
Для получения дополнительной информации см. https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SSLEngine, который имеет частичный пример кода - для клиента; вам необходимо изменить это, изменив setUseClientMode
на false
и не с использованием подсказки одноранговой идентификации. (Клиент SSL/TLS должен (кэшировать) и выбирать сохраненные сеансы (ы) по идентификатору сервера, но сервер просто использует назначенный ранее сеанс, и клиент запомнил.)
Затем см. Javadoc (с необычно подробным введением) для класс SSLEngine
в https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLEngine.html или в вашем любимом JDK/IDE.
Или Java SSLEngine example имеет некоторые ссылки от людей, которые делали примеры, но я не смотрел на них сам.
Стандартный способ использования SSLEngine. Но этот класс серьезно трудно использовать. Есть несколько учебных пособий, но для типичного приложения использование SSLEngine не должно быть и речи.
Я столкнулся с той же проблемой некоторое время назад и закончил тем, что написал свою собственную библиотеку. Есть несколько примеров, и, конечно же, есть код внутри таких проектов, как Netty и т. Д. Но ни один из вариантов не является надежным или легко повторным.
TLS Channel обертывает SSLEngine в ByteBuffer и позволяет использовать его точно так же, как и обычные SocketChannels.