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