SSL e SocketChannel
-
22-08-2019 - |
Domanda
Idealmente, ho solo bisogno di un semplice SSLSocketChannel
.
Ho già un componente che legge e scrive un messaggio su ordinario SocketChannel
, ma per alcuni di questi collegamenti, devo utilizzare SSL sopra il filo; le operazioni sopra queste connessioni, tuttavia, sono gli stessi.
Qualcuno conosce un'implementazione libera SSLEngine
(con il selettore appropriato) o qualcosa di simile? Ho trovato questo , ma il selettore non lo accetta sin dal suo fornitore non è SOLE.
sto disaccoppiare la reading_from / writing_to logica netto dall'inserimento e il recupero dei dati di rete tramite un semplice oggetto, al fine di utilizzare un <=> senza ottenere pazza, ma è molto difficile da implementare che correttamente, dato il fatto che io non conosco i meccanismi interni di protocollo SSL ...
Soluzione
Controlla la realizzazione di Restlet può fare quello che ti serve, ed è tutta una questione NIO.
In particolare la HttpClientCall. SetProtocol (HTTPS) - getResponseEntityChannel restituisce una ReadableByteChannel (getEntityChannel restituisce un WriteableByteChannel)
Altri suggerimenti
Jetty ha un'implementazione NIO SSL per i loro server: SslSelectorChannelConnector . Si potrebbe desiderare di sbirciare per i dettagli su ciò che il suo fare.
C'è anche un vecchio (ma decente) articolo di O'Reilly che spiega i dettagli su NIO + SSL insieme al codice di esempio.
TLS Canale è una semplice libreria che fa esattamente questo: avvolgere uno SSLContext (o SSLEngine ) ed esponendo un'interfaccia ByteChannel, facendo il lavoro pesante internamente.
(Disclaimer: io sono l'autore principale della biblioteca).
Non so se questo è quello che stai cercando, ma può aiutare ... Per creare socket server abilitato SSL / TLS, Attualmente sto usando il codice come il seguente (keystore.jks contiene un self firmato pubblico / privato coppia di chiavi utilizzata per il fissaggio di conferma) - i clienti hanno un negozio di fiducia simile che contiene il certificato firmato con la chiave pubblica di quella coppia.
Un po 'di googling intorno a ottenere che configurato dovrebbe farti in corso.
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