SSL и SocketChannel - PullRequest
       60

SSL и SocketChannel

13 голосов
/ 15 мая 2009

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 18 мая 2009

Jetty имеет реализацию NIO SSL для своего сервера: SslSelectorChannelConnector . Возможно, вы захотите взглянуть на него, чтобы узнать, что он делает.

Существует также старая (но достойная) статья от O'Reilly , в которой объясняются подробности о NIO + SSL вместе с примером кода.

2 голосов
/ 21 июля 2017

TLS Channel - это простая библиотека, которая делает именно это: обертывание SSLContext (или SSLEngine) и предоставление интерфейса ByteChannel, выполнение тяжелой работы внутри.

(Отказ от ответственности: я основной автор библиотеки).

0 голосов
/ 20 мая 2009

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

Restlet Engine Javadoc

В частности, HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel возвращает ReadableByteChannel (getEntityChannel возвращает WriteableByteChannel)

0 голосов
/ 18 мая 2009

Не уверен, что это то, что вы ищете, но может помочь ... Для создания серверных сокетов с поддержкой SSL / TLS в настоящее время я использую код, подобный следующему (keystore.jks содержит самоподписанный private / public пара ключей, используемая для обеспечения подтверждения) - клиенты имеют аналогичное хранилище доверия, которое содержит подписанный сертификат с открытым ключом этой пары.

Немного погоня за настройкой, вы должны начать.

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
...