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