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