Обновите сокет Java до зашифрованного после выпуска starttls - PullRequest
8 голосов
/ 08 декабря 2011

Я хочу, чтобы мое приложение говорило с сервером без шифрования перед выдачей STARTTLS, а затем обновляло сокет для шифрования после этого. Могу ли я подключиться к порту (например, 5222) и использовать STARTTLS для запроса TLS с использованием Java? Если да, какой объект Socket мне использовать для этого?

Ответы [ 3 ]

12 голосов
/ 03 января 2013

Конечно, вы можете.Используйте ваш SSLSocketFactory для создания сокета, оборачивающего существующий обычный java.net.Socket:

    SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
        socket,
        socket.getInetAddress().getHostAddress(),
        socket.getPort(),
        true);
6 голосов
/ 18 января 2013

@ Ответ Яна был полезен (и я проголосовал за него), но мне пришлось немного его настроить, чтобы он заработал для меня:

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);

Протестировано с Java 7 и GMail (smtp.gmail.com) через порт 587.

1 голос
/ 16 сентября 2014

Вот возможное улучшение: если ваш код предназначен для серверной, а не для клиентской стороны, добавьте его, и он будет работать нормально:

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