SSL и SocketChannel


В идеале мне нужен только простой SSLSocketChannel.

У меня уже есть компонент, который читает и записывает сообщения через обычный SocketChannel, но для некоторых из этих соединений я должен использовать SSL по проводу; операции над этими соединениями, однако, одинаковы.

Кто-нибудь знает свободную реализацию SSLSocketChannel (с соответствующим селектором) или что-то подобное? Я нашел это, но селектор не принимает его, так как его поставщик не SUN.

Я развязываю reading_from / writing_to net logic от вставки и извлечения сетевых данных с помощью простого объекта, чтобы использовать SSLEngine, не сходя с ума, но это действительно сложно реализовать правильно, учитывая тот факт, что я не знаю внутренние части протокола SSL...

4 13

4 ответа:

Проверьте реализацию Restlet он может сделать то, что вам нужно, и это все о NIO.

Restlet Engine Javadoc

Конкретно 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