SSL и SocketChannel
В идеале мне нужен только простой SSLSocketChannel
.
У меня уже есть компонент, который читает и записывает сообщения через обычный SocketChannel
, но для некоторых из этих соединений я должен использовать SSL по проводу; операции над этими соединениями, однако, одинаковы.
Кто-нибудь знает свободную реализацию SSLSocketChannel
(с соответствующим селектором) или что-то подобное? Я нашел это, но селектор не принимает его, так как его поставщик не SUN.
Я развязываю reading_from / writing_to net logic от вставки и извлечения сетевых данных с помощью простого объекта, чтобы использовать SSLEngine
, не сходя с ума, но это действительно сложно реализовать правильно, учитывая тот факт, что я не знаю внутренние части протокола SSL...
4 ответа:
Проверьте реализацию Restlet он может сделать то, что вам нужно, и это все о NIO.
Конкретно HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel возвращает ReadableByteChannel (getEntityChannel возвращает WriteableByteChannel)
Jetty имеет реализацию NIO SSL для своего сервера: SslSelectorChannelConnector. Возможно, вы захотите взглянуть на него, чтобы узнать подробности о том, что он делает.
Есть также старая (но приличная) статья из O'Reilly , которая объясняет подробности о NIO + SSL вместе с примером кода.
TLS Channel - это простая библиотека, которая делает именно это: оборачивает SSLContext (или SSLEngine) и предоставляет интерфейс ByteChannel, делая тяжелую работу внутри.
(отказ от ответственности: я главный автор библиотеки).
Не уверен, что это то, что вы ищете, но может помочь... Для создания сокетов серверов с поддержкой SSL / TLS я в настоящее время использую следующий код (keystore.jks содержит самозаверяющую пару закрытый / открытый ключ, используемую для обеспечения подтверждения) - клиенты имеют аналогичное хранилище доверия, которое содержит подписанный сертификат с открытым ключом этой пары.
Немного погуглить вокруг того, чтобы настроить это, должно помочь вам начать работу.
String keyStorePath = "keystore.jks"; String keyStorePassword = "password"; KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); KeyStore keyStore = new KeyStore(); keyStore.load(new FileInputStream(keyStorePath), keyStorePassword); keyManagerFactory.init(keyStore, keyStorePassword.toCharArray()); sslContext = SSLContext.getInstance("TLS"); sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); SSLContext sslContext = getServerSSLContext(namespace.getUuid()); SSLServerSocketFactory serverSocketFactory = sslContext.getServerSocketFactory(); // Create sockets as necessary