SSL и SocketChannel
в идеале, мне нужен только простой SSLSocketChannel
.
у меня уже есть компонент, который читает и пишет сообщение за обычный SocketChannel
, но для некоторых из этих соединений я должен использовать SSL по проводу; операции над этими соединениями, однако, одинаковы.
кто-нибудь знает бесплатный SSLSocketChannel
реализация (с соответствующим селектором) или что-то подобное? Я нашел этой, но селектор не принимает его, так как его поставщик не является СОЛНЦЕ.
я отделяю reading_from / writing_to net logic от вставки и извлечения сетевых данных через простой объект, чтобы использовать SSLEngine
не сердясь, но это действительно сложно реализовать правильно, учитывая тот факт, что я не знаю внутренних протоколов SSL...
4 ответов
Проверьте реализацию Restlet, это может сделать то, что вам нужно, и все дело в NIO.
Restlet Двигателя Документация
в частности HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel возвращает ReadableByteChannel (getEntityChannel возвращает WriteableByteChannel)
Jetty имеет реализацию NIO SSL для своего сервера:SslSelectorChannelConnector. Возможно, вы захотите взглянуть на него для получения подробностей о том, что он делает.
есть также старая (но приличная) статья из О'Рейли это объясняет детали о NIO + SSL вместе с примером кода.
TLS-канал - это простая библиотека, которая делает именно это: обертывание SSLContext (или SSLEngine) и предоставление интерфейса ByteChannel, выполняя тяжелую работу внутри.
(Disclaimer: я главный автор библиотеки).
Не уверен, если это то, что вы ищете, но может помочь... Чтобы создать серверные сокеты с поддержкой 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