2011-12-08 6 views
8

Desidero che la mia app comunichi con il server senza crittografia prima di emettere un STARTTLS e quindi aggiornare il socket per essere crittografato. Posso collegarmi a una porta (ad esempio, 5222) e utilizzare STARTTLS per richiedere TLS utilizzando java? Se sì, quale oggetto Socket dovrei usare per quello?Aggiornare il socket Java a crittografato dopo l'avvio dei problemi

risposta

9

Certo che puoi. Usa il tuo SSLSocketFactory per creare un socket avvolgendo un java.net.Socket regolare esistente:

SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
     socket, 
     socket.getInetAddress().getHostAddress(), 
     socket.getPort(), 
     true); 
5

@ risposta di Jan era disponibile (e ho votato a favore), ma ho dovuto modificare un po 'per farlo funzionare per me:

SSLSocket sslSocket = (SSLSocket) ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(
         socket, 
         socket.getInetAddress().getHostAddress(), 
         socket.getPort(), 
         true); 
InputStream inputStream = sslSocket.getInputStream(); 
OutputStream outputStream = sslSocket.getOutputStream(); 
// reads from the socket 
Scanner scanner = new Scanner(inputStream); 
// writes to the socket 
OutputStream outputStream = new BufferedOutputStream(outputStream); 

testato con Java 7 e GMail (smtp.gmail.com) sulla porta 587.

1

Ecco un possibile miglioramento: Se il codice è per il lato server invece che lato client, aggiungere questo, e funzionerà benissimo:

sslsocket.setUseClientMode(false); 
sslsocket.startHandshake();