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

Bij*_*joy 8 java sockets ssl starttls

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

Jan*_*Vos 12

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

    SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
        socket,
        socket.getInetAddress().getHostAddress(),
        socket.getPort(),
        true);
Run Code Online (Sandbox Code Playgroud)


jam*_*iss 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);
Run Code Online (Sandbox Code Playgroud)

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