Canali Java.nio e TLS

Come posso proteggere un SocketChannel Java, ServerSocketChannel o, forse, anche un DatagramChannel con TLS?

So che ci sono alcuni framework ( # 1 # 2 ) che pubblicizzano per essere in grado, ma voglio sapere se è ansible ottenere questo con la pura libreria standard Java da solo.

È necessario utilizzare SSLEngine , come documentato in I / O non bloccanti con SSLEngine . Le librerie che hai citato lo usano o usano librerie che lo usano.

(Si noti che questo è notoriamente difficile da usare.)

È ansible trovare questi collegamenti interessanti:

  • Questa risposta (che contiene anche un collegamento a un capitolo di un libro).
  • Note di Jean-François Arcand che l’hanno implementato in Grizzly .
  • Un esempio del tipo di problemi che puoi ottenere con SSL / TLS asincrono.
  • Anche acquisire familiarità con i problemi menzionati in questa domanda dovrebbe essere rilevante (in particolare, come affrontarli in modalità asincrona).
  • Il framework semplice supporta anche SSL async / TLS.

Per i datagrammi, dovresti esaminare l’uso di DTLS anziché TLS. Non sono sicuro del suo stato di implementazione in Java, ma potresti scavare attraverso gli archivi della mailing list java.openjdk.security.devel .

È necessario utilizzare SSLEngine e eseguire manualmente l’handshake utilizzando tale macchina di stato. SSL / TLS è implementato su TCP, quindi non è ansible utilizzarlo direttamente su un DatagramChannel .

L’articolo SSL con Java NIO può essere utile.

Come menziona correttamente Bruno, il modo standard per farlo è usare SSLEngine. Ma quella class è seriamente difficile da usare.

Ho incontrato lo stesso problema qualche tempo fa e ho finito per scrivere la mia libreria. Ci sono alcuni esempi là fuori e naturalmente c’è anche il codice all’interno di progetti come Netty, ecc. Ma nessuna delle due opzioni è robusta o facilmente riutilizzabile.

TLS Channel avvolge un SSLEngine in un ByteBuffer e consente di utilizzarlo come il normale SocketChannels.