在发布starttls之后将Java套接字升级为加密

时间:2011-12-08 04:03:38

标签: java sockets ssl starttls

我希望我的应用程序在发出STARTTLS之前与服务器通信而不加密,然后在此之后升级套接字以进行加密。我可以连接到端口(例如,5222)并使用STARTTLS使用java请求TLS吗?如果是这样,我应该使用哪个Socket对象?

3 个答案:

答案 0 :(得分:12)

当然可以。使用SSLSocketFactory创建一个包装现有常规java.net.Socket的套接字:

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

答案 1 :(得分:6)

@ Jan的答案很有帮助(我投了赞成票),但我不得不调整一下以使其适合我:

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

在端口587上使用Java 7和GMail(smtp.gmail.com)进行测试。

答案 2 :(得分:1)

这里有一个可能的改进:如果您的代码是服务器端而不是客户端,请添加它,它将正常工作:

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