9

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

4

3 回答 3

14

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

    SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
        socket,
        socket.getInetAddress().getHostAddress(),
        socket.getPort(),
        true);
于 2013-01-03T16:29:29.497 回答
7

@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) 进行了测试。

于 2013-01-18T16:46:33.760 回答
1

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

sslsocket.setUseClientMode(false); 
sslsocket.startHandshake();
于 2014-09-16T11:30:21.070 回答