2016-06-11 8 views

ответ

1

«основного» 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 имеет некоторые ссылки от людей, которые делали примеры, но я не смотрел на них сам.

1

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

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

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