Ответ 1
Проверьте реализацию Restlet, она может делать то, что вам нужно, и все о NIO.
В частности, HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel возвращает ReadableByteChannel (getEntityChannel возвращает WriteableByteChannel)
В идеале мне нужен только простой SSLSocketChannel
.
У меня уже есть компонент, который читает и пишет сообщение по обычным SocketChannel
, но для некоторых из этих подключений я должен использовать SSL по проводу; однако операции над этими соединениями одинаковы.
Кто-нибудь знает бесплатную реализацию SSLSocketChannel
(с соответствующим селектором) или что-то подобное? Я нашел этот, но селектор не принимает его, поскольку его поставщик не является SUN.
Я отключаю чтение_from/write_to net логики от вставки и извлечения сетевых данных через простой объект, чтобы использовать SSLEngine
, не злясь, но очень сложно реализовать это правильно, учитывая тот факт, что я не знаю внутренних протоколов SSL...
Проверьте реализацию 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